2014-11-23 46 views
7

是否可以從單個實例中刪除方法?僅從實例中刪除方法

class Foo 
    def a_method 
    "a method was invoked" 
    end 
end 

f1 = Foo.new 
puts f1.a_method # => a method was invoked 

我可以從已創建的對象的類的刪除a_method本:

class Foo 
    remove_method(:a_method) 
end 

如果我從同一個對象調用a_method:

puts f1.a_method # => undefined method 

如果我創建另一個object:

f2 = Foo.new 
puts f2.a_method # => undefined method 

如何才能從特定的單個對象中刪除方法?

+0

你能不能給更多的信息在你的用例中呢? – rdubya 2014-11-23 22:32:27

+0

重新定義該實例的方法以拋出異常可能更容易。 – 2014-11-23 22:33:20

回答

10

,這是可能的:

f1.instance_eval('undef :a_method') 
2

這取決於你爲什麼要這麼做:

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>