2014-05-06 55 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