仅从实例中删除方法

时间:2014-11-23 22:25:26

标签: ruby

是否可以从单个实例中删除方法?

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

如何只从特定的单个对象中删除方法?

2 个答案:

答案 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>