为什么这个闭包不会在int范围的每个元素上执行?

时间:2014-01-06 22:44:45

标签: groovy

这是我的代码:

def myclosey = {items -> 
    items + 1}
myclosey(1..3);

我希望将1添加到intrange中的每个元素。相反,1只是添加到intrange的末尾, 所以输出是

[1,2,3,1]

为什么?

2 个答案:

答案 0 :(得分:4)

IntRange是一个列表。因此,加号运算符会将一个元素附加到列表中。封闭是在范围本身上调用的,而不是范围中的每个元素。

如果您想为所有元素添加一个,可以(1..3).collect { it + 1 },或使用@dmahpatro建议的语法。

答案 1 :(得分:3)

因为你要在一个范围内传递给闭包,所以你必须这样做:

def myclosey = {items -> 
    items*.plus(1) //Spread on the range
}
assert myclosey(1..3) == [2, 3, 4]