Сообщения с ключевыми словами в smalltalk (начинающий) (Pharo)

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

subst: i1 by: i2
      ^ self copyReplaceAll: i1 with: i2.

Он будет вызываться в рабочей области следующим образом:

string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3.

Сообщение об ошибке: «MessageNotUnderstood: ByteString>>subst:by:»

Все, что должен сделать метод, это заменить каждое вхождение «m» в «Lemon» на «ss», чтобы создать «Lesson» (что уже делает copyReplaceAll). Я не могу понять, как получить string1 в методе. Любая помощь будет принята с благодарностью,

Заранее спасибо!


person Uritomi    schedule 22.03.2012    source источник


Ответы (2)


self — текущий объект (т. е. получатель).

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


"MessageNotUnderstood: ByteString>>subst:by:"

Эта ошибка означает, что вы не определили сообщение в ByteString. Либо вы нигде его не определили, либо определили не в том классе.

person Marcin    schedule 22.03.2012
comment
self - это то, что я пробовал изначально, но не сработало (извините, я должен был указать это в вопросе). Если что-то еще не так, что мне не хватает. - person Uritomi; 22.03.2012
comment
@Uritomi Пожалуйста, количественная оценка не сработала. Предоставьте полное сообщение об ошибке в своем вопросе и код, который его создал. - person Marcin; 22.03.2012
comment
Приведенный выше код — это все, что я сделал, и сообщение об ошибке было следующим: MessageNotUnderstood: ByteString››subst:by: - person Uritomi; 22.03.2012
comment
Ааа, хорошо, это многое проясняет. Похоже, мне еще далеко до smalltalk, ха-ха, спасибо за ответы! - person Uritomi; 23.03.2012
comment
@Uritomi Как я уже сказал, вам нужно пройти обучение. Также принято выражать свою признательность голосованием и принятием ответов. - person Marcin; 23.03.2012

В Smalltalk методы не являются самостоятельными вещами.

Метод — это способ ответа объекта на отправленное сообщение.

Если то, что получает сообщение, знает, как ответить на сообщение, у него есть метод ответа на сообщение. Говорят, что имя сообщения содержится в протоколе сообщения объекта.

Итак, у каждого сообщения есть получатель и имя сообщения.

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

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

(Единственным исключением является конкретный случай анонимных объектов, называемых блоками. В этих случаях метод определяется в определении блока).

Вот пример сообщения с ключевым словом: Transcript show: 'Hello World!'

Это означает «отправить сообщение show: 'Hello World!' получателю Transcript». (Транскрипт — это окно, отображающее вывод системы. Все графические среды Smalltalk имеют класс Transcript).

Это сообщение состоит из трех частей:

Крайняя левая часть всегда является получателем. В этом примере получательTranscript.

Название сообщения show: содержит одно ключевое слово show:.

Аргумент 'Hello World'

(Еще более полное объяснение Transcript show: 'Hello World!'
можно найти на странице [http://beginningtosmalltalk.blogspot.com/2015/11/hello-world.html]

Пример сообщения с ключевыми словами с несколькими ключевыми словами:

aByteString copyReplaceAll: i1 with: i2

Получатель aByteString, экземпляр класса ByteString

Имя сообщения — copyReplaceAll:with:. Оно состоит из двух ключевых слов: copyReplaceAll: и with:.

Аргументы: i1 и i2.

Если класс ByteString (или любой класс выше него в иерархии классов, например String) содержит метод, то сообщение находится в протоколе объекта.

string1 := 'Lemon' . string1 copyReplaceAll: i1 with: i2

При желании вы можете добавить свой код в String или ByteString в качестве дополнительного метода.

subst: i1 by: i2
"Substitute all instances of substring i1 with string i2. Return the receiver"
^ self copyReplaceAll: i1 with: i2

Затем его можно вызвать в рабочей области следующим образом:

string1 := 'Lemon'. string2 := 'm'. string3 := 'ss'. string1 subst: string2 by: string3

Но string1 subst: string2 by: string3 не сильно отличается от
string1 copyReplaceAll: string2 with: string3

Еще один момент, на который стоит обратить внимание, заключается в том, что каждое ключевое слово в сообщении с ключевым словом должно быть как можно более описательным и недвусмысленным. subst может означать substitute или substring

Самый простой способ добавить метод в класс — использовать системный браузер. Щелкните класс в системном обозревателе, и в области редактирования появится определение метода-проформы.

Перепечатайте его и введите Accept it (в моей системе щелкните правой кнопкой мыши на 2-х или 3-кнопочной мыши или нажмите сочетание клавиш «Ctrl-s». Хотя сопоставление мыши и клавиш может различаться на разных платформах).

person Euan M    schedule 15.11.2015