2010-05-31 57 views
2
def foo(map, name) { 
    println(map) 
} 

foo("bar", hi: "bye") 

将打印splat运算符在groovy中?

[hi:bye] 

现在我有一个以前的地图,我想一起FOO通过。在伪代码,类似:

def otherMap = [hi: "world"] 
foo("bar", hi: "bye", otherMap*) 

所以它打印

[hi:world] 

当然,这是行不通的。

此外,试图通过刚刚地图混合参数的顺序:

def otherMap = [hi: "world"] 
foo("bar", otherMap) 

将打印

bar 

我该如何解决这个问题?

+1

你怎么能指望'FOO( “酒吧”,otherMap)'打印的东西比'bar'别的吗?您正在打印第一个参数。 – Geo 2010-05-31 09:43:24

回答

7

您正在寻找扩散图运算符。

def foo(map, name) { 
    println(map) 
} 

foo("bar", hi: "bye") 

def otherMap = [hi: "world"] 
foo("bar", hi: "bye", *:otherMap) 
foo("bar", *:otherMap, hi: "bye") 

打印:

["hi":"bye"] 
["hi":"world"] 
["hi":"bye"] 
0

我不知道你到底想达到什么,所以这里有几种可能性:

如果你想从第二映射到第一张地图添加内容时,leftShift运营商是要走的路:

def foo(name, map) { 
    println(map) 
} 

def otherMap = [hi: "world"] 
foo("bar", [hi: "bye"] << otherMap) 

如果你想通过访问其名称的参数使用地图:如果你要打印所有或只有最后参U

def foo(Map args) { 
    println args.map 
} 

def otherMap = [hi: "world"] 
foo(name:"bar", first:[hi: "bye"], map:otherMap) 

se可变参数:

def printLast(Object[] args) { 
    println args[-1] 
} 

def printAll(Object[] args) { 
    args.each { println it } 
} 

def printAllButName(name, Map[] maps) { 
    maps.each { println it } 
} 

def otherMap = [hi: "world"] 
printLast("bar", [hi: "bye"], otherMap) 
printAll("bar", [hi: "bye"], otherMap) 
printAllButName("bar", [hi: "bye"], otherMap)