移除方法

除了创建新方法之外,有时你可能希望移除现有方法。你可以通过在特定类作用域内使用 remove_method 执行此操作。这将删除特定类中指定符号的方法:

rem_methods1.rb
  1. puts( "hello".reverse )
  2. class String
  3. remove_method( :reverse )
  4. end
  5. puts( "hello".reverse ) #=> "undefined method" error!

如果为该类的祖先类定义了具有相同名称的方法,则不会删除祖先类中的同名方法:

rem_methods2.rb
  1. class Y
  2. def somemethod
  3. puts("Y's somemethod")
  4. end
  5. end
  6. class Z < Y
  7. def somemethod
  8. puts("Z's somemethod")
  9. end
  10. end
  11. zob = Z.new
  12. zob.somemethod #=> "Z's somemethod"
  13. class Z
  14. remove_method( :somemethod )
  15. end
  16. zob.somemethod #=> "Y's somemethod"

相反,undef_method 阻止指定的类响应方法调用,即使在其一个祖先类中定义了一个具有相同名称的方法:

undef_methods.rb
  1. zob = Z.new
  2. zob.somemethod #=> "Z's somemethod"
  3. class Z
  4. undef_method( :somemethod )
  5. end
  6. zob.somemethod #=> "undefined method" error