重新定义类方法时,我希望能够调用super,就像在实例方法中一样。
例如,我有一个类hi方法Hi.hi
class Hi
def self.hi
puts "hi"
end
end
Hi.hi #=> "hi"
现在,让我们说我想重新定义self.hi
class Hi
def self.hi
super
puts "Oh!"
end
end
Hi.hi #=> NoMethodError: super: no superclass method `hi' for Hi:Class
为什么这不起作用?
我知道我可以使用别名(如下所示)获得相同的功能,但这似乎是不必要的。
class Hi
class << self
def new_hi
old_hi
puts "Oh!"
end
alias :old_hi :hi
alias :hi :new_hi
end
end
Hi.hi #=> "hi\n Oh!"
有更好的方法吗?
答案 0 :(得分:3)
Super适用于从父类继承的子类。
在你的情况下,别名是唯一的方法。或者您可以使用alias_method:
alias_method :old_hi, :hi
def self.hi
old_hi
puts "Oh!"
end
答案 1 :(得分:1)
在你的代码的上下文中,“super”指的是Object类,因为Object没有“hi”类级别方法,所以它失败了。 “Hi”是“Class”类型的对象。
您没有定义超级类,因此它默认为object。 您可以通过键入“Hi.superclass”
在控制台上看到此信息更好的方法是使用传统的OOP来做到这一点:
class Hi
def self.hi
puts "hi"
end
end
class Ho < Hi
def self.hi
super
puts "Oh!"
end
end
“class&lt;&lt; self”语法最终会创建一个不可见的中间类来执行继承链。
你创建一个新类并不重要,因为新类扩展了旧类,它们是可以互换的,除了self.hi()的不同输出
答案 2 :(得分:0)
它不起作用。因为你班上的祖先嗨没有方法。
答案 3 :(得分:0)
我不明白你的问题。
如果你真的重新定义了self.hi(Saying:super有一个喜欢),那么它有效:
class Hi_super
def self.hi
puts "Oh - super!"
end
end
class Hi < Hi_super
def self.hi
super
puts "Oh!"
end
end
Hi.hi
或者在另一个版本中:
class Object
def self.hi
puts "Oh - super!"
end
end
class Hi
def self.hi
super
puts "Oh!"
end
end
Hi.hi
两个版本的结果都是
Oh - super!
Oh!