调用数组上的每个函数会返回数组

时间:2015-02-01 13:09:29

标签: ruby

与任何其他方法不同,each返回接收者。返回接收器的循环点是什么?是否有类似的具体用途:

([1,2,3,4,5].each do |e| end).send(:some_method)

3 个答案:

答案 0 :(得分:1)

Array#each在方法调用结束时返回self,以显示函数的调用者没有以任何方式进行变异。你用它们调用的块实际上在它终止后就被丢弃了。

答案 1 :(得分:1)

each仅因其副作用而执行。它的回报价值毫无意义。它可以返回nil,但为什么不简单地返回self,以防你想用它做其他事情?

顺便说一句,each肯定不是返回其接收器的唯一方法。例如,<<通常也会这样做,至少对于ArrayString和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没有返回(可能已修改的)接收器,我们就无法做到这一点。还不够吗?