我有几种方法具有相似的条件逻辑,我认为干它们是合理的。
class A
def parent1(val)
puts "parent1 A #{val}"
end
def parent2(val)
puts "parent2 A #{val}"
end
end
class B < A
def parent1(val)
if val
puts "foo"
else
super
end
end
def parent2(val)
if val
puts "bar"
else
super
end
end
end
是否可以创建一个#puts_or_super
来调用其来电者的super
? (B#parent1
或B#parent2
)因此代码如下所示:
def parent1(val)
puts_or_super(val, "foo")
end
def parent2(val)
puts_or_super(val, "bar")
end
编辑:这有效,但看起来很疯狂
def puts_or_super(val, text)
if val
puts text
else
self.class.superclass.instance_method(caller[0][/`.*'/][1..-2].to_sym).bind(self).call
end
end
有更好的解决方案吗?
答案 0 :(得分:0)
假设您的定义在类A
中,并且相关的超级方法在类B
中定义,以便A
继承自B
。
我认为你应该走另一条路。将B
作为模块,并将B
添加到A
。然后,您拥有"foo"
,"bar"
等的定义将不是超级方法,条件将位于前置模块中。
module B
def parent1(val)
return super if val
... # your original logic in super class
end
def parent2(val)
return super if val
... # your original logic in super class
end
end
class A
prepend B
def parent1(_); puts "foo" end
def parent2(_); puts "bar" end
end