从类方法调用super

时间:2011-07-19 20:38:08

标签: ruby

重新定义类方法时,我希望能够调用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!"

有更好的方法吗?

4 个答案:

答案 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!