【问题标题】:splat operator in groovy?groovy 中的 splat 运算符?
【发布时间】:2010-05-31 09:23:03
【问题描述】:
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

我该如何解决这个问题?

【问题讨论】:

  • 您如何期望foo("bar",otherMap) 打印除bar 之外的其他内容?您正在打印第一个参数。
  • @Geo 是的,我想知道同样的事情(但我是 Groovy 的新手,所以不知道)。特别是我对 OP 中的以下内容感到困惑: foo("bar", hi: "bye") 打印 [hi: "bye"] 而不是 "bar" (但如果您更改为 foo("bar", [hi :“再见”]))它按预期工作。有谁能指教一下吗?

标签: groovy dsl


【解决方案1】:

您正在寻找扩展映射运算符。

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"]

【讨论】:

    【解决方案2】:

    我不确定您到底想达到什么目标,所以这里有几种可能性:

    如果你想将第二个地图的内容添加到第一个地图,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)
    

    如果您想打印全部或只打印最后一个参数,请使用可变参数:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2017-07-09
      • 2015-12-11
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2013-11-13
      相关资源
      最近更新 更多