2012-05-16 3 views
3

Я нообей в Smalltak, но мне нужно понять некоторые вещи для моего тезиса. Что именно происходит при создании строки или любого другого объекта? Например, сделайте так:Что происходит при создании строки в smalltalk?

fruit <- 'apple' 

Когда я пытаюсь осмотреть плод объекта, я вижу, что он имеет 5 inst vars. Если бы я назначил «грушу» фруктам, у нее было бы 4 инстава. Таким образом, интерпретатор создал новый экземпляр bytestring, добавил необходимые inst vars для каждого символа и присвоил им правильные значения? Я верю, что есть что-то еще, но я не могу найти его нигде, и у меня нет времени на то, чтобы правильно изучить smalltalk. Можете ли вы объяснить это мне или дать мне ссылку, где я могу ее найти?

+1

«У меня нет времени на то, чтобы правильно изучить мелкий предмет: Почему вы смотрите на smalltalk? – Mark

+0

Мне нужно это для моей школьной диссертации. Я делаю что-то вроде сравнения некоторой части нескольких языков программирования. – peto1234

ответ

5

Строки - это объекты. Объекты содержат переменные экземпляра и отвечают на сообщения. В Smalltalk существуют в основном два типа переменных экземпляра: именованные переменные экземпляра ссылаются по имени (например, имя или номер телефона в объекте Person), а индексированные переменные экземпляра ссылаются на цифры. String использует индексированные переменные экземпляра.

Рассмотрим следующий пример:

fruit := String new: 5. 
fruit at: 1 put: $a; 
    at: 2 put: $p; 
    at: 3 put: $p; 
    at: 4 put: $l; 
    at: 5 put: $e. 

Это создает строку с пространством для 5 символов. Затем он получает переменную fruit, указывающую на этот объект. Затем он записывает 5 символов в строку. Результатом является строка «apple».

Поскольку строки так часто используются, компилятор поддерживает специальный синтаксис для создания строк во время компиляции.

fruit := 'apple' 

В этом примере «яблоко» представляет собой строковый литерал. Компилятор Smalltalk создает строку при компиляции строки. Когда вы запустите строку, вы сделаете фрукт точкой в ​​строке «apple», которая имеет 5 индексированных переменных экземпляра, содержащих объекты Character.

+0

Обрезающий педантичный вопрос Дэвид ... В случае объекта с индексом байтов вы все еще считаете правильным обращаться к ним, как в индексированных переменных экземпляра. Являются ли «байты», найденные в байтовом индексируемом объекте, действительно объектами? Вы можете получить объекты (символы и числа), которые их представляют, но они не совпадают с этими байтами. IOW, «Apple» представляет собой один объект, о котором диспетчер памяти должен беспокоиться, а не 1 + 5. Это, конечно, не соответствует объяснению «начального уровня». –

+0

Да, они реализованы по-другому, но внешний вид программиста Smalltalk заключается в том, что они ведут себя как объекты. Не имеет значения, как разработчик языка решил представлять данные. Если он похож на объект и ведет себя как объект, то это объект. Я слышал, что он сказал, что с компьютерными языками вы можете обманывать, пока вас не поймают. Если бы вы дали мне поддельное дерево, которое было бы неотличимо от настоящего дерева во всех отношениях, то я все равно буду называть это деревом. Как это для метафизики? –

3

Строки индексируемые объекты, что означает, что они являются массивами и слоты пронумерованы вместо «меченого» ...

4

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

Строка, в Smalltalk, представляет собой просто набор символов, где каждый символ хранится в позиции, которую он занимает внутри строки.

Некоторые примеры, чтобы вы познакомились с Струны быть так же, как Массивы:

'Good Morning' at: 3. 
#(1 'hi' $d 5.34) at: 3. 

'Good Morning' fourth. 
#(1 'hi' $d 5.34) fourth. 

'Good Morning' reversed. 
#(1 'hi' $d 5.34) reversed. 

'Good Morning' select: [ :each | each ~= $d ]. 
#(1 'hi' $d 5.34) select: [ :each | each ~= $d ]. 

Как вы можете видеть, струнные только один вид коллекции.

3

Первое, что выражение, которое вы даете в качестве примера, не создает строку. Это простое назначение.

fruit := 'apple' 

не создает строку. Он присваивает существующей строке «яблоко» переменной фрукта. Если вы хотите создать новую strins, вы должны использовать (байты) Строку новой: похож на Массив нового: ..

Это как компилятор на самом деле создает новые строки при компиляции исходного кода.

+0

Но строка «apple» не существует до того, как компилятор начал обрабатывать инструкцию? И я имею в виду включение разбора курса –

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