如何将 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
实例的这个中间步骤就变得微不足道了。
给定一个数组 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
实例的这个中间步骤就变得微不足道了。