gpt4 book ai didi

ruby - 在此方法调用者的上下文中调用 super

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:45 26 4
gpt4 key购买 nike

我有几个具有相似条件逻辑的方法,我认为将它们 DRY 是合理的。

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

是否可以创建一个能够调用其调用者的 super#puts_or_super? (B#parent1B#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

有更好的解决方案吗?

最佳答案

假设你的定义在A类中,相关的super方法定义在类B中,这样A继承自 B.

我认为你应该反其道而行之。使 B 成为一个模块,并将 B 添加到 A 之前。然后,您拥有 "foo""bar" 等的定义将不是 super 方法,条件将在前置模块中。

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

关于ruby - 在此方法调用者的上下文中调用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31072174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com