将Procs变成Block混乱

时间:2013-04-12 20:21:35

标签: ruby

我知道我们在方法的参数前面使用&符号以避免使用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

2 个答案:

答案 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