与任何其他方法不同,each
返回接收者。返回接收器的循环点是什么?是否有类似的具体用途:
([1,2,3,4,5].each do |e| end).send(:some_method)
答案 0 :(得分:1)
Array#each
在方法调用结束时返回self,以显示函数的调用者没有以任何方式进行变异。你用它们调用的块实际上在它终止后就被丢弃了。
答案 1 :(得分:1)
each
仅因其副作用而执行。它的回报价值毫无意义。它可以返回nil
,但为什么不简单地返回self
,以防你想用它做其他事情?
顺便说一句,each
肯定不是返回其接收器的唯一方法。例如,<<
通常也会这样做,至少对于Array
,String
和co。 (但不适用于Integer
。)
答案 2 :(得分:1)
对于给定的整数数组,假设您想要做两件事:
执行此操作的一种方法如下:
def doit(arr)
i = 0
arr.each { |e| arr[i] = 2*e; i += 1 }.reduce(:+)
end
sum = doit(arr) #=> 12
arr #=> [2, 4, 6]
现在让我们考虑另一个问题。我们想要打印arr
的每个元素三次,并返回其值的总和:
def doit(arr)
arr.each { |e| puts 3*e }.reduce(:+)
end
sum = doit(arr)
# 6
# 12
# 18
#=> 12
在对@ sawa自删除的答案的评论中,信徒表达了他/她对“在迭代期间修改数组元素”的沮丧,这同样适用于我的两个例子中的第一个。
为什么我必须将自己局限于我们都同意代表良好编程习惯的例子?重点是Ruby让我们这样做,如果each
没有返回(可能已修改的)接收器,我们就无法做到这一点。还不够吗?