Как однозначно идентифицировать окно стенограммы в Pharo/Squeak?

Я новичок в smalltalk и, как и все остальные языки программирования, которые я выучил, я попытался создать простую программу "Hello World". Я узнал, что в Pharo/Squeak вы открываете окно расшифровки, набираете следующий код в окне рабочей области и затем нажимаете Alt-d для его запуска:

Transcript show: 'hello world'; cr.

Насколько я понимаю, под строкой подразумевается отправка сообщения "show" с аргументом "hello world" объекту Transcript, и, как и ожидалось, мое окно теперь показывает:

hello world

однако пока все хорошо, когда я открыл второе окно записи и снова запустил код, я обнаружил, что оба окна записи теперь имеют:

hello world

Как будто оба окна стенограммы идентифицируются идентификатором "Транскрипт". Это то, что сбило меня с толку, потому что я подумал бы, что окна стенограммы должны быть "экземплярами" класса окна стенограммы. Следовательно, не должен ли быть способ уникальной идентификации их?

2 ответа

Решение

Это сложный и отличный вопрос. Smalltalk имеет большой словарь, в котором хранятся все глобальные переменные. Глобалы обычно являются классами, но там может быть любой объект. Это просто словарь (ключ / значение). Этот большой словарь, о котором я говорю, называется Smalltalk. Напишите "Smalltalk осмотреть", и вы увидите это. Это уникальный экземпляр класса SmalltalkImage.

Итак... когда в вашем коде вы вводите MyClass, это происходит потому, что в значении "Smalltalk at:#MyClass" у вас есть класс. Но вы также можете сделать: Smalltalk по адресу:#mariano put: 'mariano'. Затем вы можете написать "Мариано" везде, и вы получите строку "Мариано".

Стенограмма такая. В (Smalltalk at:#Transcript) хранится уникальный экземпляр Transcript. Который действительно может быть не экземпляром класса Transcript, а другим классом. В pharo это экземпляр ThreadSafeTranscript. Проверь это:

ThreadSafeTranscript instanceCount -> 1 Транскрипция открыта. Стенограмма открыта. Стенограмма открыта.

И у тебя всегда будет такой. Потому что сам Transcript - это МОДЕЛЬ. Не вид. Представление (окна, которые открываются при открытии Transcript) - это экземпляры PluggableTextMorph, модель которого является уникальным экземпляром Transcript. Проверь это:

PluggableTextMorph instanceCount - >> 11 Открыть запись. Стенограмма открыта. Стенограмма открыта. PluggableTextMorph instanceCount ->> 14

Для более подробной информации, отладка "Transcript open".

ура

Transcript - это глобальная переменная, содержащая экземпляр. Осмотрите его, чтобы увидеть его класс и, таким образом, посмотрите, как открыть другое окно, на которое вы бы поместили локальную ссылку.

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