这个Groovy脚本看起来很简单:
def a = [].join() println a
我希望它抛出MissingMethodException,因为join方法需要一个参数,如果我看到的是正确的,但它工作just fine。下面是这个方法的源代码,所以这个参数绝对不是可选的。你知道我期望的失败在哪里吗?当然是在Jenkins。那么,它为什么会起作用呢?是不是有什么我不知道的Groovy大会或者它实际上调用了一个不同的方法?
MissingMethodException
join
e1xvtsh31#
我认为你提供了参数,但它是空的。你最后在DefaultGroovyMethods类中调用这个方法:
public static String join(Iterator<?> self, String separator) { if (separator == null) { separator = ""; } ...
虽然默认的groovy方法被注入到所有的Groovy对象中(你可以在注解中找到这个信息here),我假设第一个参数总是通过注入到iterable中来填充,而第二个参数,正如你所看到的,当它为null时,它被设置为空字符串。因此,在我看来,[].join()将空列表和null传递给join方法,这实际上意味着将空字符串设置为分隔符。
[].join()
**编辑:**是的,你是对的,我们可以在这个问题上做更多的挖掘。当然,Groovy假设当需要1个参数(但不是原始类型)的函数在没有参数的情况下被调用时传递null:
def f1(String a){ println a } f1() // prints word "null"
Here是8年前发现它的人的一些信息。我相信这是您所遗漏的难题--如果没有参数,则会导致Groovy在参数不是基本类型时传递null。我不知道注入默认groovy方法的机制如何使join方法接受Iterable,但String参数行为现在应该很清楚了。不是吗?
Iterable
String
1条答案
按热度按时间e1xvtsh31#
我认为你提供了参数,但它是空的。你最后在DefaultGroovyMethods类中调用这个方法:
虽然默认的groovy方法被注入到所有的Groovy对象中(你可以在注解中找到这个信息here),我假设第一个参数总是通过注入到iterable中来填充,而第二个参数,正如你所看到的,当它为null时,它被设置为空字符串。因此,在我看来,
[].join()
将空列表和null传递给join
方法,这实际上意味着将空字符串设置为分隔符。**编辑:**是的,你是对的,我们可以在这个问题上做更多的挖掘。当然,Groovy假设当需要1个参数(但不是原始类型)的函数在没有参数的情况下被调用时传递null:
Here是8年前发现它的人的一些信息。我相信这是您所遗漏的难题--如果没有参数,则会导致Groovy在参数不是基本类型时传递null。我不知道注入默认groovy方法的机制如何使
join
方法接受Iterable
,但String
参数行为现在应该很清楚了。不是吗?