我需要一些帮助来了解这里发生了什么。它是方法中的一个块。除了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
答案 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
以获得相同的功能。