【问题标题】:Chaining methods using Symbol#to_proc shorthand in Ruby?在 Ruby 中使用 Symbol#to_proc 速记链接方法?
【发布时间】:2012-02-27 04:50:54
【问题描述】:

我想知道有没有一种方法可以使用 (&:method) 链接方法

例如:

array.reject { |x| x.strip.empty? }

把它变成:

array.reject(&:strip.empty?)

由于它的可读性,我更喜欢简写符号。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.1


    【解决方案1】:

    不,没有简写。你可以定义一个方法:

    def really_empty?(x)
      x.strip.empty?
    end
    

    并使用method:

    array.reject(&method(:really_empty?))
    

    或使用 lambda:

    really_empty = ->(x) { x.strip.empty? }
    array.reject(&really_empty)
    

    但除非您在足够多的地方使用 really_empty? 以使拆分逻辑有意义,否则我不会更好地称呼其中任何一个。

    但是,由于您使用的是 Rails,您可以只使用 blank? 而不是 .strip.empty?

    array.reject(&:blank?)
    

    请注意,nil.blank? 是真的,而 nil.strip.empty? 只是给你一个例外,所以它们并不完全等价;但是,您可能也想拒绝nils,因此无论如何使用blank? 可能会更好。 blank? 也为 false{}[] 返回 true,但您的字符串数组中可能没有这些。

    【讨论】:

    • 你也可以定义really_empty? “数组内容类”(例如字符串)上的方法,然后像空白方法一样使用它。我不是建议这样做,只是说你可以..
    【解决方案2】:

    这样写上面的内容会很好,但它不是受支持的语法,您希望使用 to_proc 语法 (&:) 链接方法的方式如下:

    .map(&:strip).reject(&:empty?)

    【讨论】:

    • 尽管实际上我不会像那样尝试将它们链接在一起,但我会选择按原样使用您的原始示例。
    • 我只是出于兴趣进行了快速测试,发现使用原始方式(在我的系统上)比使用双速记方式(这对于另一个临时数组有意义)必须作为map 的一部分分配。
    【解决方案3】:

    您可以使用ampex gem:

    require 'ampex'
    array.reject &X.strip.empty?
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2012-10-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多