如何将Proc用作块

时间:2018-12-27 13:55:34

标签: ruby codeblocks

给出一个数组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)。

1 个答案:

答案 0 :(得分:6)

只需:

newarr = myarr.map(&mapper)

Proc实例是对象,而块不是对象。它们是不可互换的。您需要使用&将一个转换为另一个。在mapper是符号的情况下,&&mapper的作用不仅仅是将mapper转换为Proc实例;这只是将mapper转换/解释为块的过程的一部分。当mapper已经是Proc实例时,这没有什么不同;只是将其转换为Proc实例的中间步骤变得很简单。