2011-01-23 1 views
1

Я использую рубин 1.9.2отрефакторит метод с блоком, который содержит нескольких блоков самой

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

например

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 и имеет простой метод один строки для каждого, если/конец заявления

например это выглядело бы примерно так:

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

+0

Где указаны критерии1 и критерии2? – scragz

+0

критерии1 и критерии2 на самом деле не являются критическими. они могут быть любыми (например, если Time.new.year> 2010). – user141146

+0

На самом деле я не знаю, что делать c1_method и c2_method. Они возвращают множество объектов, которые затем необходимо объединить? Являются ли критерии взаимоисключающими? – knowtheory

ответ

0

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

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