2009-03-12 2 views
1

Я задаюсь вопросом, почему следующее не работает в GNU Smalltalk:Почему я не могу создать новый подкласс и использовать его в том же предложении?

Object subclass: Foo [ ] new printNl 

Я ожидал распечатку что-то вроде «Foo», но вместо GST печатает «ноль». Разве это не кажется странным?

ответ

2

Object subclass: Foo [] не является «обычным» синтаксисом Smalltalk, это недавнее дополнение, предназначенное для практического кодирования в файлах. До этого не было выделенного синтаксиса для объявления класса, поскольку они были бы созданы командой на изображении. Интерпретируя этот код, как вы ожидали бы неправильно по нескольким причинам:

  • Во-первых, если subclass: был настоящий сообщение, отправленное на Object, то Foo должны решить к чему-то, что невозможно, так как он просто объявляется , Однако за кулисами компилятор делает что-то подобное Object subclass: #Foo, где #Foo является символом для названия нового класса, который будет создан. Можно было бы написать весь такой код, за исключением того, что вы не могли использовать имена классов напрямую (поскольку они еще не существуют при чтении кода). Вам нужно было бы сделать (Smalltalk at: #Foo) new printNl повсюду. Таким образом, вся форма Object subclass: Foo [ ] чистый синтаксис, который просто заявляет, что этот класс должен быть создан, и не означает, что в данный момент сообщение должно быть отправлено в Object и т.д.

  • Во-вторых, вы не хотите создавать классы в середине алгоритма и отправить их сообщения сразу, что было бы довольно уродливо, как практика развития. Обратите внимание, что классы должны быть зарегистрированы в системе, чтобы браузер мог их отображать, что компилятор может автоматически перекомпилировать зависимости, которые элемент управления версией может их записать и т. Д. Кроме того, что, если ваш код случайно запускает это дважды? Должен ли вы получить второй класс Foo и забыть о предыдущем? Поэтому, как правило, только компилятор, браузер и другие средства метапрограммирования создают новые классы и только по запросу программиста.

+0

Создание подклассов на лету хорошо работает в java>: – milan

2

Это интерпретируется как два утверждения. Первый

Объект подкласса: Foo []

, а второй

новый printNl

, где новая переменная не определена, так что равна нулю.

Смежные вопросы