我有一个带有方法栏的类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_eval
,class_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