【问题标题】:refactor a method with a block that contains multiple blocks itself使用包含多个块本身的块重构方法
【发布时间】:2011-01-23 21:37:24
【问题描述】:

我正在使用 Ruby 1.9.2

我有一个名为 search 的类方法,它需要一个块

例如

class MyClass
  def self.search do
    if criteria1
      keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end

    if criteria2
      keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

我想做的是重构 MyClass.search 方法,并为每个 if/end 语句提供一个简单的单行方法

例如它看起来像这样:

class MyClass

  def self.search do
    c1_method
    c2_method
  end

  def self.c1_method
    if criteria1
      return keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end
  end

  def self.c2_method
    if criteria2
      return keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

但我在上面展示的重构并不完全奏效。看起来我在 c1_method 和 c2_method 中返回的“块”并没有真正在搜索方法中返回和评估,但我不知道该怎么做。

【问题讨论】:

  • criteria1和criteria2在哪里定义?
  • criteria1 和 criteria2 并不是很重要。它们可以是任何东西(例如,如果 Time.new.year > 2010)。
  • 实际上,我不清楚 c1_method 和 c2_method 打算做什么。它们是否返回需要合并的对象集?这些标准是否相互排斥?

标签: ruby-on-rails ruby lambda block


【解决方案1】:

好吧,您可以使用method(sym) 调用来获取方法的主体。

>> def foo(bar); bar * 2; end
=> nil
>> def baz(bleep); method(:foo).call(bleep); end
=> nil
>> baz(6)
=> 12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2015-07-21
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多