4

可能重复:
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

但我从来没有真正使用过。是否存在一些 undef 实际上有用的常见情况?

编辑——刚刚在“The Ruby Programming Language”一书中遇到了这个:

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

4

2 回答 2

6

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

希望有人可以指出一些更传统的用途。

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

于 2011-01-14T22:23:50.840 回答
6

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

class Item
  def set
    do_something
  end
end

class ExecItem < Item
  undef set
end

虽然我想undef_method会有同样的效果。

于 2011-01-15T01:36:40.863 回答