在这个Ruby方法中调用了什么?

时间:2014-08-08 23:03:15

标签: ruby

我需要一些帮助来了解这里发生了什么。它是方法中的一个块。除了if语句wasABlock_nowAProc.call中的调用之外,我基本上都能得到所有内容。这里没有定义,所以它叫什么?

class Array

  def eachEven(&wasABlock_nowAProc)
    isEven = true  #  We start with "true" because arrays start with 0, which is even.

    self.each do |object|
      if isEven
        wasABlock_nowAProc.call object
      end

      isEven = (not isEven)  #  Toggle from even to odd, or odd to even.
    end
  end

end

['apple', 'bad apple', 'cherry', 'durian'].eachEven do |fruit|
  puts 'Yum!  I just love '+fruit+' pies, don\'t you?'
end

#  Remember, we are getting the even-numbered elements
#  of the array, all of which happen to be odd numbers,
#  just because I like to cause problems like that.
[1, 2, 3, 4, 5].eachEven do |oddBall|
  puts oddBall.to_s+' is NOT an even number!'
end

2 个答案:

答案 0 :(得分:1)

def eachEven(&wasABlock_nowAProc)声明eachEven方法接受一个块,这是您的两个示例中的do ... end内容。然后可以在方法中将其作为.call能够使用名称为wasABlock_nowAProc的Proc / Lambda对象进行访问。

wasABlock_nowAProc.call object基本上从方法中调用附加的块,并向其传递一个参数object

答案 1 :(得分:0)

谷歌搜索"红宝石块以触发"并且any的第一批结果应该给你一个彻底的解释。

基本上,当您使用&amp ;;定义方法参数时它在前缀(如def eachEven(&wasABlock_nowAProc))中告诉Ruby,该方法期望接收Proc object作为参数。在方法体中,您可以使用Proc进行操作,例如使用#call方法运行它或将其传递给另一个方法。

现在,Ruby程序员手动创建Proc对象的情况很少见。只使用一个块(更少打字,更容易阅读等)更常见。如果你试图将一个块传递给需要Proc的方法,那么,Ruby处理就好了。它神奇地将块转换为Proc并使用它。

在这个特定的例子中,我可以看到定义&wasABlock_nowAProc参数的唯一原因是,如果使用块调用该方法,则告诉Ruby引发错误。您可以删除参数并将#call行替换为yield以获得相同的功能。