给出一个数组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
)。
答案 0 :(得分:6)
只需:
newarr = myarr.map(&mapper)
Proc
实例是对象,而块不是对象。它们是不可互换的。您需要使用&
将一个转换为另一个。在mapper
是符号的情况下,&
中&mapper
的作用不仅仅是将mapper
转换为Proc
实例;这只是将mapper
转换/解释为块的过程的一部分。当mapper
已经是Proc
实例时,这没有什么不同;只是将其转换为Proc
实例的中间步骤变得很简单。