Переопределить ноль в 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 - это один из классических способов оторваться. (Однажды я знал парня, который сделал это. Он не был счастлив... и после этого всегда немного хромал. Забавная старая вещь, жизнь...).
Поделитесь и наслаждайтесь.