2014-05-06 53 views
1

考虑以下Groovy脚本:MethodMissing参数数量订单

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] T为 '厂商ID' 和args [1 ]成为地图。

任何想法,为什么顺序似乎被颠倒?这种行为是否一致?

回答

3

这是正确的。在Groovy中,方法调用中的所有映射条目都将被收集并作为第一个参数传入。

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" 

您可以强制地图正常秩序,如果你使用它声明在methodMissing,它们是作为参数数组中的第一个元素传递方括号:

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