рефакторинг метода с блоком, который содержит несколько блоков - PullRequest
1 голос
/ 24 января 2011

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

1 Ответ

0 голосов
/ 24 января 2011

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

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