MethodMissing Args Order

时间:2014-05-06 14:24:48

标签: groovy

考虑使用Groovy脚本:

class Scaffold{
 def methodMissing(String name, args) {
    println name
    println args[0]
    println args[1]
 }
}

new Scaffold().field('VendorId', 'entity': 'Vendor', 'value': '1');

当我运行它时,输出是:

field
[entity:Vendor, value:1]
VendorId

我期待args [0]为'VendorId'而args [1]为地图。

为什么订单似乎被逆转的任何想法?这种行为会保持一致吗?

1 个答案:

答案 0 :(得分:3)

这是正确的。在Groovy中,将收集方法调用中的所有映射条目并将其作为第一个参数传入。在methodMissing中,它们作为arguments数组中的第一个元素传递:

def methodMissing(String name, args) {
  "$name ${args[0]} ${args[1]}"
}

assert foo(a: 1, 'john doe', b: 2) == "foo [a:1, b:2] john doe"

对于非遗漏方法调用:

def method(map, name) { "$map $name" }
assert method(a: 1, 'test', b: 2) == "[a:1, b:2] test"

如果使用方括号声明地图,则可以强制执行地图正常顺序:

def methodMissing(String method, args) {
  "$method ${args[0]} ${args[1]}"
}

assert echo("foo", [a: 1, b: 2]) == "echo foo [a:1, b:2]"

http://mrhaki.blogspot.com.br/2009/09/groovy-goodness-named-parameters-are.html