2013-07-18 1 views
2

У меня есть подкласс с общим рисунком во многих из его методов:Как мне получить ссылку на супер и передать ее?

if some_condition 
    (real code goes here) 
else 
    super 
end 

В идеале я хотел бы, чтобы инкапсулировать его в чем-то вроде:

def if_some_condition 
    if some_condition 
    yield 
    else 
    (calling method's super) 
    end 
end 

Есть ли способ захватить метод вызывающего super, так что я могу назвать это в филиале elseif_some_condition?

(. Прежде чем предложить использование другого подкласса, обратите внимание, что some_condition может часто меняться в течение всего срока службы объектов в этом классе)


EDIT:

Возможное решение:

def if_some_condition(&b) 
    if some_condition 
    yield 
    else 
    b.send(:binding).eval('super') 
    end 
end 

Я предпочел бы избежать использования eval, если возможно.

ответ

0

Я думаю, что вы никогда не должны вызывать супер снаружи класса ... может быть, вы могли бы добавить логический параметр «супер», когда «супер» истинно вы называете супер метод

Вы можете увидеть результат здесь: http://repl.it/KOd

class My_base_class 
    def methode_one(argument={}) 
    puts "yabadabadou" 
    end 
end 

class My_sub_Class < My_base_class 
    def methode_one(argument={}) 
    if(argument[:super]) 
     puts "taratata" 
    else 
     super 
    end 
    end 
end 


def if_some_condition(b) 
    if 1==1 
    b.methode_one({:super=>false}) 
    else 
    b.methode_one({:super=>true}) 
    end 
end 

def if_some_other_condition(b) 
    if 1==0 
    b.methode_one({:super=>false}) 
    else 
    b.methode_one({:super=>true}) 
    end 
end 
Смежные вопросы