如何使用Proc作为块

use*_*428 2 ruby codeblocks

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

mapper = :foo
newarr = myarr.map(&mapper)
Run Code Online (Sandbox Code Playgroud)

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

假设mapper不是Symbol,但已经是一个Proc实例.这个,然后:

mapper = :foo.to_proc
newarr = myarr.map(mapper)
Run Code Online (Sandbox Code Playgroud)

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

我当然可以这样做:

newarr = myarr.map {|x| mapper.call(x)}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一个&:foo我可以在这里使用的快捷方法(类似).

saw*_*awa 6

做就是了:

newarr = myarr.map(&mapper)
Run Code Online (Sandbox Code Playgroud)

Proc实例是一个对象,而块是不是对象.它们不可互换.你需要使用一个转换为另一个&.如果mapper是符号,则&in 的效果&mapper不仅仅是转换mapperProc实例; 这只是转换/解释mapper为/作为块的过程的一部分.当mapper已经是一个Proc实例时,这没有什么不同; 只是这个将其转换为Proc实例的中间步骤变得微不足道.