这个 Groovy 脚本看起来很简单:
def a = [].join()
println a
我希望它会抛出
MissingMethodException
,因为join
方法需要一个参数,如果我正在查看正确的,但它工作很好。
而here是该方法的源代码,因此该参数绝对不是可选的。
你知道它在哪里失败了吗?当然是在詹金斯。
那么,为什么它有效呢?是否有一些我不知道的 Groovy 约定?或者它实际上调用了不同的方法?
我认为您正在提供参数,但它是空的。您最终在 DefaultGroovyMethods 类中调用此方法:
public static String join(Iterator<?> self, String separator) {
if (separator == null) {
separator = "";
}
...
虽然默认的 groovy 方法被注入到所有 Groovy 对象中(您可以在注释中找到此信息here),但我假设第一个参数始终通过将其注入可迭代的事实来填充,而第二个参数如您所见设置为空当字符串为空时。因此,我认为
[].join()
将空列表和 null 传递给 join
方法,这实际上意味着将空字符串设置为分隔符。