Ruby中的隐式收益怎么样?

时间:2014-11-03 06:47:52

标签: ruby

我经常写:

some_array.each { |array_element| array_element.some_method(args) }

为什么没有隐含收益的选项,所以你可以写例如:

some_array.each { _.some_method(args) }

我不确定实际应该是什么字符_,我想它只会用在大多数样板设置中,你处理的是一维数组而只是试图产生每个项目连续到块。它可以节省大量的冗余打字。

1 个答案:

答案 0 :(得分:2)

您是否熟悉方法调用的#to_proc&语法?它们涵盖了一些类似于您在此处展示的情况。例如:

[1, -2, -4].map(&:abs) => [1, 2, 4]

&用于传递对象代替块。如果对象不是Proc,则会自动调用#to_proc以获取Proc,然后才能使用Symbol#to_proc代替块。 Proc会返回{ |obj, *args| obj.symbol_name(*args) },其行为类似于:args

在您的示例中,您使用的Symbol#to_proc可能是从周围的词汇环境中捕获的。 Proc不会帮助你。但要建立一个新的class Symbol def with_args(*args) Proc.new { |x| x.send(self, *args) } end end 构建方法并不难。例如:

some_array.each(&:some_method.with_args(args))

然后你可以这样做:

{{1}}

这是否比明确的块更好取决于你。无论如何,这是你应该注意的一种技术。