调用特征类的类方法



我需要为类的某些实例重写类方法

class Foo
  def eigen_class
    class << self
      self
    end
  end
  def self.foo
    "original foo"
  end
  def override_foo
    class << self
      def self.foo
        "overridden foo"
      end
    end
  end
end
foo = Foo.new
foo.override_foo
foo.class.foo # => "original foo"
foo.eigen_class.foo # => "overridden foo"
foo2 = Foo.new
foo2.eigen_class.foo # => "original foo"

有没有办法在不显式获取特征类的情况下调用重写的方法?

您将该方法分配给了错误的上下文。这是一个修复:

class << foo.class
  def foo
    "foo"
  end
end

这会将方法固定到 Foo 类上,而不是该特定实例的特征类上。

由于foo的实现可能因实例而异,因此我建议简单地使用常规方法(即实例方法,而不是类方法)。您可以使用模块非常轻松地执行此操作,使所有覆盖保持独立。

module FooOverrides
  def foo
    "overridden foo"
  end
end
class Foo
  def foo
    "original foo"
  end
  def override_foo
    self.extend(FooOverrides)
  end
end
foo = Foo.new
foo.override_foo
foo.foo # => "overridden foo"
foo2 = Foo.new
foo2.foo # => "original foo"

或者,如果您确实想调用foo.class.foo,则可以覆盖#class以返回eigen_class。

class Foo
  def override_foo
    class << self
      def self.foo
        "overridden foo"
      end
      def class
        eigen_class
      end
    end
  end
end

通常,重写在 Object 上定义的方法(如 #class)是不好的,因为它可能会产生意想不到的后果。

相关内容

  • 没有找到相关文章

最新更新