groovy 为什么这个没有参数的join方法调用会成功?

vaj7vani  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

这个Groovy脚本看起来很简单:

def a = [].join()
println a

我希望它抛出MissingMethodException,因为join方法需要一个参数,如果我看到的是正确的,但它工作just fine。下面是这个方法的源代码,所以这个参数绝对不是可选的。你知道我期望的失败在哪里吗?当然是在Jenkins。
那么,它为什么会起作用呢?是不是有什么我不知道的Groovy大会或者它实际上调用了一个不同的方法?

e1xvtsh3

e1xvtsh31#

我认为你提供了参数,但它是空的。你最后在DefaultGroovyMethods类中调用这个方法:

public static String join(Iterator<?> self, String separator) {
        if (separator == null) {
            separator = "";
        }
...

虽然默认的groovy方法被注入到所有的Groovy对象中(你可以在注解中找到这个信息here),我假设第一个参数总是通过注入到iterable中来填充,而第二个参数,正如你所看到的,当它为null时,它被设置为空字符串。因此,在我看来,[].join()将空列表和null传递给join方法,这实际上意味着将空字符串设置为分隔符。

**编辑:**是的,你是对的,我们可以在这个问题上做更多的挖掘。当然,Groovy假设当需要1个参数(但不是原始类型)的函数在没有参数的情况下被调用时传递null:

def f1(String a){
    println a
}

f1() // prints word "null"

Here是8年前发现它的人的一些信息。我相信这是您所遗漏的难题--如果没有参数,则会导致Groovy在参数不是基本类型时传递null。我不知道注入默认groovy方法的机制如何使join方法接受Iterable,但String参数行为现在应该很清楚了。不是吗?

相关问题