рефакторинг метода с блоком, который сам содержит несколько блоков

Я использую Руби 1.9.2

У меня есть метод класса, называемый поиском, который принимает блок

e.g.

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, на самом деле не возвращаются и не оцениваются в методе поиска, но я не уверен, как это сделать.


person user141146    schedule 23.01.2011    source источник
comment
Где определены критерии1 и критерии2?   -  person scragz    schedule 24.01.2011
comment
критерии1 и критерии2 на самом деле не критичны. они могут быть любыми (например, если Time.new.year › 2010).   -  person user141146    schedule 24.01.2011
comment
На самом деле мне неясно, для чего предназначены c1_method и c2_method. Возвращают ли они наборы объектов, которые затем необходимо объединить? Являются ли критерии взаимоисключающими?   -  person knowtheory    schedule 24.01.2011


Ответы (1)


Что ж, вы можете использовать вызов method(sym), чтобы получить тело метода.

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