undef的实际用途

时间:2011-01-14 22:08:06

标签: ruby undef

  

可能重复:
  undef - Why would you want to undefine a method in 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

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

编辑 - 刚刚在“The Ruby Programming Language”一书中遇到过这个问题:

  

另一种防止复制的技巧   对象是简单地使用undef   删除克隆和dup方法。然而   另一种方法是重新定义   克隆和重复方法使他们   引发错误的异常   特别说出来的消息   不允许复制。这样的   错误消息可能会有所帮助   正在使用你的班级的程序员。

2 个答案:

答案 0 :(得分:6)

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

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

修改 请参阅上一个问题:undef - Why would you want to undefine a method in ruby?

答案 1 :(得分:6)

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

class Item
  def set
    do_something
  end
end

class ExecItem < Item
  undef set
end

虽然我猜undef_method会产生同样的效果。