我知道我们在方法的参数前面使用&符号以避免使用yield,如果它没有找到阻塞,则会输出错误。
然而,我看到有时候我们会使用&当我们调用一个方法时,在themementnt前面,以便将proc转换回一个块。最终会发生有2个&符号,一个用于将块转换为触发器,第二个用于相反的转换。
怎么样?!我们什么时候需要把&符号从proc中取回一个块,为什么?
我希望我已经清楚了,因为不是英语母语可能会对我提出苛刻的问题。
实施例
我从CodeSchool的幻灯片中选择了这个例子,可以在http://courseware.codeschool.com/ruby_bits_2/ruby_bits_2_level_1.pdf找到。
class Timeline
attr_accessor :tweets
def each(&block)
tweets.each(&block)
end
end
答案 0 :(得分:2)
我知道我们在方法前面使用&符号 参数是为了避免使用yield,如果输出会产生错误 它没有找到障碍物。
你的理解是错误的。
使用&block
作为最后一个参数将块捕获到Proc
,特别是存储它并稍后使用它。在调用方法时,&block
执行相反的操作,即指定该块对应于给定的block
。这与def foo(*args)
和foo(*args)
的想法相同。
您提供的示例基本上等同于:
def each
tweets.each{|t| yield y}
end
正如Yehuda Katz在this talk结束时解释的那样,你应该将“块”视为Proc
,它具有特殊的参数位置和指定它的专用语法。
答案 1 :(得分:1)
将它们一起使用是很常见的。这是因为块不能用作参数,而proc可以。因此,如果您需要将块用作方法体内的参数,则必须将其转换为proc。
在该方法中,您可能希望将proc传递给另一个只接受块的方法,因此您必须再次进行转换。
例如:
def each(&block) # block to proc
posts.each(&block) # proc to block
end