2014-11-23 5 views
7

È possibile rimuovere un metodo da una singola istanza?Rimuovere un metodo solo da un'istanza

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

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

posso rimuovere a_method dal una classe dall'oggetto già creato con questo:

class Foo 
    remove_method(:a_method) 
end 

Se invoco a_method dallo stesso oggetto:

puts f1.a_method # => undefined method 

Se creo un'altra oggetto:

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

Come posso rimuovere un metodo da un singolo oggetto specifico?

+0

potete dare maggiori informazioni nel tuo caso d'uso per questo? – rdubya

+0

Potrebbe essere più semplice ridefinire il metodo per quell'istanza per generare l'eccezione. –

risposta

10

, è possibile:

f1.instance_eval('undef :a_method') 
2

Dipende perché si vuole fare questo:

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 

Un'alternativa a undef:

s = Papa.new 
s.instance_eval { self.class.send(:undef_method, :a) } 
s.a #=> NoMethodError: undefined method `a' for #<Papa:0x00000103041290> 
Problemi correlati