undef的实际用途

cha*_*ers 4 ruby undef

可能重复:
undef - 为什么要在ruby中取消定义方法?

任何人都可以在红宝石中为undef布置实际用途吗?我来自javascript和python这样没有内置的语言.你当然可以用javascript之类的语言模拟它:

var obj = { func:function(){alert("works")} }
obj.func() // -> "works"
delete(obj["func"])
obj.func() //->obj.func() is not a function
Run Code Online (Sandbox Code Playgroud)

但我从来没有真正使用过它.是否有一些常见的情况,其中undef实际上有用?

编辑 - 刚刚在"红宝石编程语言"一书中遇到过这个问题:

另一种防止复制对象的技术是使用undef来简单地删除clone和dup方法.另一种方法是重新定义clone和dup方法,以便它们引发异常,并显示一条错误消息,明确指出不允许复制.这样的错误消息可能对正在使用您的类的程序员有所帮助.

noo*_*odl 6

我只能说我5年来从未使用它.也许更有用的是,通过整个rails的源代码只显示7个实例,并且它们都与元编程相关.(undef_method在22处有更多实例).它似乎对测试带有和没有模块混合的类的行为很有用.

希望有人可以为它指出一些更常规的用途.

编辑 请参阅前一个问题:undef - 为什么要在ruby中取消定义方法?


zet*_*tic 6

阻止子类调用超类中定义的方法(这实际上是在mongrel中使用的setup.rb)(释义):

class Item
  def set
    do_something
  end
end

class ExecItem < Item
  undef set
end
Run Code Online (Sandbox Code Playgroud)

虽然我猜undef_method也会有同样的效果.