2

我知道我们在方法的参数前面使用 & 号是为了避免使用 yield,如果它在它的方式中没有找到一个块,它会输出一个错误。

但是,我看到有时我们在调用方法时在参数前面使用 & ,以便将 proc 转换回块。最终会发生 2 个 & 符号,一个用于将块转换​​为 proc,第二个用于相反。

怎么样?!我们什么时候需要将 & 号用于从 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
4

2 回答 2

2

我知道我们在方法的参数前面使用 & 号是为了避免使用 yield,如果它在它的方式中没有找到一个块,它会输出一个错误。

你的理解是错误的。

您使用&block作为最后一个参数将块捕获到 aProc中,特别是存储它并在以后使用它。调用方法时,&block执行相反的操作,即指定块对应于给定的block. def foo(*args)这与和的想法相同foo(*args)

你给出的例子基本上相当于:

def each
   tweets.each{|t| yield y}
end

正如 Yehuda Katz 在本次演讲结尾所解释的那样,您应该将“块”视为Proc具有特殊参数位置和指定它的专用语法的 a。

于 2013-04-12T21:07:22.740 回答
1

通常将它们一起使用。之所以如此,是因为块不能用作参数,而 procs 可以。所以如果你需要在方法体中使用块作为参数,你必须把它变成一个proc。

在该方法中,您可能希望将 proc 传递给仅接受块的另一个方法,因此您必须再次进行转换。

例如:

def each(&block) # block to proc
  posts.each(&block) # proc to block
end
于 2013-04-12T20:54:31.097 回答