如何通过instance_eval重写类方法



我有一个带有方法栏的类Foo。如何用覆盖foo's bar

Foo.instance_eval do
def bar
#do something a little different
end
end

要覆盖的内容:

module Lorem
class Foo
def bar
# do something
end
end
end

需要使用instance_evalclass_eval可以重写,但不保留上下文

假设您想更改module Lorem,以便无论何时包含它,都会使用新的bar(),那么您就非常接近:

module Lorem
class Foo
def bar
puts "old bar"
end
end
end
Lorem::Foo.class_eval do
def bar
puts "new bar"
end
end
class A
include Lorem
Foo.new.bar #=> "new bar"
end

我认为您试图实现的问题是,您试图覆盖已经创建的对象的方法。

为了做到这一点,您需要迭代这些对象,并使用ObjectSpace覆盖它们的方法,如中所示https://stackoverflow.com/a/14318741/226255

以下内容没有帮助:

class Foo
def bar
puts "hello"
end
end
x = Foo.new
Foo.instance_eval do
def bar
puts "bar"
end
end
x.bar

您得到以下输出:

hello
=> nil

为了覆盖在执行instance_eval之前创建的对象的方法,请执行以下操作:

x = Foo.new
ObjectSpace.each_object(Foo) { |obj|
def obj.bar
puts "bar"
end
}

你得到的输出:

x.bar
bar
=> nil

最新更新