是否可以从单个实例中删除方法?
class Foo
def a_method
"a method was invoked"
end
end
f1 = Foo.new
puts f1.a_method # => a method was invoked
我可以从已创建的对象中删除类a中的a_method:
class Foo
remove_method(:a_method)
end
如果我从同一个对象调用a_method:
puts f1.a_method # => undefined method
如果我创建另一个对象:
f2 = Foo.new
puts f2.a_method # => undefined method
如何只从特定的单个对象中删除方法?
答案 0 :(得分:14)
是,有可能:
f1.instance_eval('undef :a_method')
答案 1 :(得分:3)
这取决于你想要这样做的原因:
class Grampa
def a
puts "Gramps"
end
end
class Papa < Grampa
def a
puts "Papa"
end
end
p = Papa.new
p.instance_eval 'undef :a'
p.a #=> NoMethodError: undefined method `a' for #<Papa:0x0000010114abe8>
q = Papa.new
q.instance_eval { self.class.send(:remove_method, :a) }
q.a #=> Gramps
r = Papa.new
r.a #=> Papa
undef
的替代方案:
s = Papa.new
s.instance_eval { self.class.send(:undef_method, :a) }
s.a #=> NoMethodError: undefined method `a' for #<Papa:0x00000103041290>