Почему 22 при преобразовании в строку с printOn или StoreOn по-прежнему добавляется как целое число? - PullRequest
3 голосов
/ 11 ноября 2011

Это мой код:

x := 22 storeString.
y := x + x.
Transcript show: y.

Ожидаемый результат: 2222 Фактическая мощность: 44.

Я думал, что сообщение storeString, отправленное 22 и присвоенное x, приведет к сохранению строкового значения в x.

Так что я подумал, что я довольно новичок в Smalltalk. Может быть, это порядок операций? Итак, я попробовал это:

x := (22 storeString).
y := x + x.
Transcript show: y.

Тот же результат и тот же, если я использую printOn вместо storeOn. Вероятно, это вопрос типа учебника следующего дня. Но что происходит? Обратите внимание, что я знаю об операторе конкатенации (,), но мне все еще интересно, как получается, что вы можете добавить две строки вместе, как это? Произошло ли некое неявное преобразование из строки обратно в целое число как часть +?

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

Только несколько вещей неявно подразумеваются в Smalltalk.Вы можете просмотреть реализацию селектора #+ в классе String и узнать, что происходит.Или выведите String >> #+ definition.Вы также можете проверить внутренние компоненты любого экземпляра работающего объекта, чтобы вы могли оценить x inspect, чтобы узнать, что x действительно является строкой.

3 голосов
/ 12 ноября 2011

Открыть рабочее пространство. Введите:

'12 '+' 34 '

Выделите и затем используйте правую кнопку меню, чтобы вызвать «отладку». Если когда-либо существовало «приложение-убийца» для Smalltlak, то именно так отладчик Smalltalk взаимодействует с природой Smalltalk «все объекты постоянно». Вы можете видеть, что все есть и как оно работает. Если вы используете «в», вы сможете точно увидеть, как это происходит, превратив это в «46».

Даже круче (я думаю), что вы можете сделать

12 + '34'

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

Вы можете даже сделать более странные примеры, такие как

4,0 + # ('13' 2)

(здесь мы добавляем число в массив, а содержимое массива смешанного типа)

Счастливого малого разговора!

3 голосов
/ 11 ноября 2011

#+ реализован на String и выполняет приведение к Number перед выполнением сложения.

Squeak имеет много кода eToys (разновидность Smalltalk для детей), разбросанного по его основной базе кода. Это, вероятно, причина, по которой String реализует все математические операторы. В Pharo математические операторы в основном удалены из String, поэтому '1' + '2' вызывает ошибку, как и в любом другом Smalltalk.

2 голосов
/ 20 декабря 2015

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

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

поэтому, если вам нужна конкатенация строк, вам нужно отправить правильное сообщение:

x := 22 storeString.
y := x , x.
Transcript show: y.
...