1

我想重新定义 smalltalk 的nil以像objective-c中的那样工作。因此,当nil收到无法处理的消息时,它会返回nil。现在我知道这nil只是一个快捷方式,但是在RubyUndefinedObject中是否有类似的东西,所以我可以重新定义它以始终返回nilmethod_missingUndefinedObject

4

3 回答 3

11

您正在寻找的方法doesNotUnderstand:在 Smalltalk 中被调用。您确实可以实现:

UndefinedObject>>doesNotUnderstand: aMessage
    ^ nil

但是,请记住,这会影响整个系统,并且可能会产生微妙的副作用或在系统的其他部分引入错误。

另请注意,UndefinedObject它不是原始类型,而是继承自Object. 因此nil,已经理解了大量的消息,并且可能不会像您期望的来自 Objective-C 的那样表现。

于 2012-04-14T15:10:37.007 回答
1

考虑创建您自己的实现#doesNotUnderstand: 的 Null 单例类,这样您就不会修改 nil。将超类设为 nil(如 Object)。

在需要的情况下回答类似“^Null instance”而不是“^nil”的内容。

Null instance badMethod  --> nil
于 2012-04-16T12:03:50.337 回答
0

如果你是唯一一个会处理这个代码的人,我说去吧。

另一方面,如果这是某个公司拥有的产品,它不是“您”的同义词,并且其他人可能在某些时候必须维护它,我强烈建议您不要这样做。在 Smalltalk 的核心修改类是让你大吃一惊的经典方法之一。(我曾经认识一个这样做的人。他开心......之后总是一瘸一拐。有趣的老东西,生活......)。

分享和享受。

于 2012-04-18T17:06:06.680 回答