gpt4 book ai didi

groovy - 命名参数的呕吐括号倒序

转载 作者:行者123 更新时间:2023-12-01 00:15:42 24 4
gpt4 key购买 nike

http://docs.groovy-lang.org/latest/html/documentation/#_named_arguments中什么都没有这将解释这种行为。

def foo(String a,Map b) { println "a: ${a}; b: ${b}" }
foo('a',b : 'c')

导致错误: No signature of method: Script1.foo() is applicable for argument types: (java.util.LinkedHashMap, java.lang.String) values: [[b:c], a]
def foo(String a,Map b) { println "a: ${a}; b: ${b}" }
foo('a',[b : 'c'])

打印出来: a: a; b: [b:c]
交换定义中的参数顺序也可以编译:
def foo(Map b,String a) { println "a: ${a}; b: ${b}" }
foo('a',b : 'c')

打印出来 a: a; b: [b:c]
这是 groovy 中的错误还是一些意想不到的“groovy 优点”?

最佳答案

这实际上是未记录的 Groovy 行为。当使用带有附加参数的命名参数时,Groovy 期望 Map如果您在 map 定义中跳过方括号,则代表命名参数的参数是该方法的第一个参数。如果我们分析编译器生成的字节码,我们将看到以下行:

foo('a',b : 'c')

由以下Java代码表示:
CallSite[] var1 = $getCallSiteArray();
return var1[1].callCurrent(this, ScriptBytecodeAdapter.createMap(new Object[]{"b", "c"}), "a");

如您所见,传递给 callCurrent() 的参数顺序与您在调用 foo() 时定义的方法相比,方法是相反的方法。这有点令人困惑,尤其是添加方括号会显式更改生成的字节码:
foo('a', [b: 'c'])

由以下Java代码表示:
CallSite[] var1 = $getCallSiteArray();
return var1[1].callCurrent(this, "a", ScriptBytecodeAdapter.createMap(new Object[]{"b", "c"}));

它在 Venkat Subramanian 的“Programming Groovy 2”一书中得到了简要解释:

class Robot {
def type, height, width

def access(location, weight, fragile) {
println "Received fragile? $fragile, weight: $weight, loc: $location"
}
}

robot = new Robot(type: 'arm', width: 10, height: 10)
robot.access(x: 30, y: 20, z: 10, 50, true)
robot.access(50, true, x: 30, y: 20, z: 10)

"This access() method receives three parameters, but if the first parameter is a Map we can float around the map's key-values in the argument list. (...) Although the kind of flexibility in the Robot example is powerful, it can get confusing, so use it sparingly. (...) We can avoid confusion like this by explicitly naming the first parameter as Map:"

def access(Map location, weight, fragile) { /* .. */ }


顺便说一句,像 IntelliJ IDEA 这样的 IDE 有助于理解参数的顺序:

enter image description here

现在,如果我只设置 Map fragile它会提醒我们的方法调用有问题:

enter image description here

另外,使用 @groovy.transform.TypeChecked@groovy.transform.CompileStatic注释有助于在编译时捕获此类问题。希望能帮助到你。

关于groovy - 命名参数的呕吐括号倒序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52832382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com