我需要为类的某些实例重写类方法
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
)是不好的,因为它可能会产生意想不到的后果。