оператор сплат в заводной? - PullRequest
3 голосов
/ 31 мая 2010
def foo(map, name) {
  println(map)
}

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

напечатает

[hi:bye]

Теперь у меня есть предыдущая карта, которую я хочу передать foo. В псевдокоде что-то вроде:

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

чтобы печатать

[hi:world]

Это не работает, конечно.

Также, попытка передать только карту смешивает порядок аргументов:

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

напечатает

bar

Как я могу это исправить?

Ответы [ 2 ]

7 голосов
/ 31 мая 2010

Вы ищете оператора карты распространения.

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 голосов
/ 31 мая 2010

Я не уверен, чего именно вы хотите достичь, поэтому есть несколько возможностей:

Если вы хотите добавить содержимое со второй карты на первую карту, оператор leftShift - это то, что нужно:

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

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

Если вы хотите получить доступ к параметру через его имя, используйте Map:

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

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

Если вы хотите напечатать все или только последний параметр, используйте varargs:

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)
...