Переопределить ноль в smalltalk, чтобы ответить на любое сообщение

Я хочу переопределить ноль smalltalk, чтобы он работал так же, как в target -c. Поэтому, когда ноль получает сообщение, которое он не может обработать, он возвращает ноль. Теперь я знаю, что nil это просто ярлык для UndefinedObject но есть ли что-нибудь подобное method_missing в Ruby, чтобы я мог переопределить его в UndefinedObject всегда возвращать ноль?

3 ответа

Решение

Метод, который вы ищете, называется doesNotUnderstand: в Smalltalk. Вы действительно можете реализовать:

UndefinedObject>>doesNotUnderstand: aMessage
    ^ nil

Однако имейте в виду, что это влияет на всю систему в целом и может иметь незначительные побочные эффекты или приводить к ошибкам в других частях системы.

Также обратите внимание, что UndefinedObject не примитивный тип, а обычный класс, наследующий от Object, Therefor nil уже понимает большое количество сообщений и может вести себя не так, как вы ожидаете от Objective-C.

Подумайте о создании своего собственного одноэлементного класса Null, который реализует #doesNotUnderstand: чтобы вы не изменяли nil. Сделайте супер класс ноль (как Object).

Ответьте что-нибудь вроде '^Null instance' вместо '^nil' в тех случаях, когда вы этого хотите.

Null instance badMethod  --> nil

Если вы единственный человек, который когда-либо будет работать над этим кодом, я говорю, пойти на это.

С другой стороны, если это продукт, принадлежащий какой-то компании, который не является синонимом слова "вы", и кому-то еще иногда может потребоваться сохранить это, я настоятельно рекомендую вам НЕ делать этого. Модификация классов в основе Smalltalk - это один из классических способов оторваться. (Однажды я знал парня, который сделал это. Он не был счастлив... и после этого всегда немного хромал. Забавная старая вещь, жизнь...).

Поделитесь и наслаждайтесь.

Другие вопросы по тегам