【发布时间】:2012-11-07 02:56:51
【问题描述】:
是否可以将映射扩展为方法参数列表
在 Python 中是可能的,例如。 Expanding tuples into arguments
我有一个def map = ['a':1, 'b':2]
和一个方法def m(a,b)
我想像m(*map)这样写smt
【问题讨论】:
标签: groovy arguments parameter-passing
是否可以将映射扩展为方法参数列表
在 Python 中是可能的,例如。 Expanding tuples into arguments
我有一个def map = ['a':1, 'b':2]
和一个方法def m(a,b)
我想像m(*map)这样写smt
【问题讨论】:
标签: groovy arguments parameter-passing
spread operator (*) 用于将列表拆分为单个元素。这可用于调用具有多个参数的方法,然后将列表传播到参数的值中。
列表(Groovy 中的列表与 Python 中的元组关系最密切1,2):
list = [1, 2]
m(*list)
地图:
map = [a: 1, b: 2]
paramsList = map.values().toList()
m(*paramsList)
重要的一点是您按位置传递参数。
【讨论】:
def m(a,b) 和一个映射def map = [b:1, a:2] 那么方法调用是什么-m(1,2) 或m(2,1) 或未定义......
def map = [b:1, a:2] 方法调用是m(1,2) 但实现在未来可能会改变,这取决于引擎盖下使用的数据结构。 Groovy 文档说映射是值的无序键。您可以在此处了解有关此主题的更多信息:Sorted maps in groovy
目前我能想到的最好的是:
@groovy.transform.Canonical
class X {
def a
def b
def fn( a, b ) {
println "Called with $a $b"
}
}
def map = [ a:1, b:2 ]
def x = new X( map.values().toList() )
x.fn( map.values().toList() )
但是,在调用函数/构造函数时,这会考虑映射的顺序,而不是键的名称。
您可能想要添加一个采用 Map 的函数/构造函数,然后这样做
【讨论】:
*map 使用扩展运算符?我见过它只用在像map*.values()这样的方法上。如何理解上面的代码?
values(),将它们转换为toList(),然后传播该列表。添加大括号可能会帮助您了解发生了什么:new X( *(map.values().toList()) )
*map的用法。你可以简单地写map.values().toList() 并且工作正常!
* 是多余的:-/
*: in groovy f(*:[a: 1, b: 2])
mmap = { 'a':1, 'b':2 }
def m( a, b ):
return a+b
print m( **mmap )
30
3
【讨论】:
** 运算符