如何捕获对super的引用并将其传递?

时间:2013-07-18 00:14:45

标签: ruby oop inheritance

我的子类在其许多方法中都有一个共同的模式:

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,以便我可以在else的{​​{1}}分支中调用它?

(在建议使用另一个子类之前,请注意if_some_condition可能会在该类中对象的生命周期内频繁更改。)


编辑:

可能的解决方案是:

some_condition

尽管如此,我宁愿避免使用def if_some_condition(&b) if some_condition yield else b.send(:binding).eval('super') end end

1 个答案:

答案 0 :(得分:0)

我认为你永远不应该从课外调用super ...也许你可以添加一个布尔参数“super”,当“super”为true时你调用super方法

您可以在此处查看结果: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