如何将 Proc 用作块

How to use a Proc as a block

给定一个数组 myarr 和数组的每个元素都理解的方法 foo,我可以通过以下方式生成一个新数组:

mapper = :foo
newarr = myarr.map(&mapper)

因为 & 快捷方式将存储在 mapper 中的符号转换为 Proc

假设 mapper 不是 Symbol,但已经是 Proc 实例。那么这个:

mapper = :foo.to_proc
newarr = myarr.map(mapper)

引发错误,因为 Array#map 不接受参数。

我当然可以:

newarr = myarr.map {|x| mapper.call(x)}

但我想知道是否有我可以在这里使用的快捷方式(类似于&:foo)。

就这样:

newarr = myarr.map(&mapper)

一个Proc实例是一个对象,而块不是一个对象。它们不可互换。您需要使用 & 将一个转换为另一个。如果mapper是一个符号,&mapper中的&的作用不仅仅是将mapper转换为Proc实例;这只是 converting/interpreting mapper to/as 区块过程的一部分。当 mapper 已经是一个 Proc 实例时,这没有什么不同;只是将它转换为 Proc 实例的这个中间步骤就变得微不足道了。