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,以便我可以在else分支中调用它if_some_condition

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


编辑:

一个可能的解决方案是:

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

eval不过,如果可能的话,我宁愿避免使用。

4

1 回答 1

0

我认为你永远不应该从类外调用 super ......也许你可以添加一个布尔参数“super”,当“super”为真时,你调用 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
于 2013-08-26T02:51:45.583 回答