我经常写:
some_array.each { |array_element| array_element.some_method(args) }
为什么没有隐含收益的选项,所以你可以写例如:
some_array.each { _.some_method(args) }
我不确定实际应该是什么字符_
,我想它只会用在大多数样板设置中,你处理的是一维数组而只是试图产生每个项目连续到块。它可以节省大量的冗余打字。
答案 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}}
这是否比明确的块更好取决于你。无论如何,这是你应该注意的一种技术。