【问题标题】:What about implicit yield in Ruby? [duplicate]Ruby 中的隐式收益呢? [复制]
【发布时间】:2014-11-03 06:47:52
【问题描述】:

我经常写:

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

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

some_array.each { _.some_method(args) }

我不确定 _ 实际上应该是什么字符,我想它只会在最样板设置中使用,您正在处理一维数组并试图将每个项目屈服于接连阻拦。这将节省大量多余的输入。

【问题讨论】:

  • 有趣的想法。该实现将是一个问题,但这是一个细节:class A; def a; puts 'hi'; end; end_ = A.new,_.a #=> hi`。

标签: ruby


【解决方案1】:

您熟悉方法调用的#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-building 方法并不难。例如:

class Symbol
  def with_args(*args)
    Proc.new { |x| x.send(self, *args) }
  end
end

那么你可以这样做:

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

这是否比显式块更好取决于您。无论如何,这是您应该注意的技术。

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 2010-10-04
    • 2016-12-14
    • 1970-01-01
    • 2016-07-30
    • 2015-11-09
    • 2013-07-03
    • 2019-09-19
    • 2011-02-24
    相关资源
    最近更新 更多