Можно ли создать автономный метод / функцию (без какого-либо класса) - PullRequest
3 голосов
/ 01 мая 2019

Я пытаюсь понять smalltalk.Возможно ли иметь автономный метод / функцию, которая не является частью какого-либо конкретного класса и которую можно вызвать позже:

amethod ['amethod called' printNl]. 
amethod.

Приведенный выше код дает следующую ошибку:

simpleclass.st:1: expected Eval, Namespace or class definition

Как я могу использовать Eval или Namespace, как предлагается в сообщении об ошибке?

Я пробовал следующее, но ничего не работает:

Eval amethod [...
amethod Eval [...
Eval amethod Eval[...        "!"

Eval [... работает, но я хочу датьимя для блока, чтобы я мог позвонить позже.

Следование также работает, но выполняется немедленно и не выполняется при вызове позже.

Namespace current: amethod ['amethod called' printNl]. 

Спасибо за понимание.

Ответы [ 2 ]

5 голосов
/ 01 мая 2019

В Smalltalk эквивалентом автономного метода является Block (a.k.a. BlockClosure). Вы создаете их, заключая выражения Smalltalk в квадратные скобки. Например

[3 + 4]

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

[3 + 4] value

, который ответит 7.

Блоки могут также иметь аргументы:

[:s | 3 + s]

вы оцениваете их с value:

[:s | 3 + s] value: 4  "answers with 7"

Если в блоке есть несколько предложений, вы разделяете их точкой, как в теле метода.


Добавление

Блоки в Smalltalk - это объекты первого класса. В частности, можно ссылаться на них с помощью переменных, то же самое можно делать с другими объектами:

three := 3.
threePlus := [:s | three + s].

для последующего использования

threePlus value: 4    "7"

Блоки могут быть вложенными:

random := Random new.
compare := [:p :u | u <= p]
bernoulli60 := [compare value: 0.6 value: random next].

Тогда последовательность:

bernoulli60 value.  "true"
bernoulli60 value.  "false"
...
bernoulli60 value.  "true"

ответит с true примерно в 60% случаев.

2 голосов
/ 01 мая 2019

Ответ Леандро, хотя он и правильный, и с глубоким пониманием разговоров, отвечает на то, что вы просили, но я думаю, что вы не уверены на 100%, что вы на самом деле спрашиваете, как «поиграть» с кодом без необходимости создаватькласс.

На мой взгляд, желание, которое вы хотите, называется Рабочее пространство (Smalltalk / X и Dolphin) (оно может иметь разные имена, например Playground в Pharo Smalltalk).

Если вы хотите поиграть, вам нужно создать локальную переменную.

| result |

result := 0. "Init otherwise nil"

"Adding results of a simple integer factorial"
1 to: 10 do: [ :integer |
     result := result + integer factorial
].

Transcript show: result.

Объяснение:

Я использую блок do: для итерации 1-10.(:integer является локальной переменной блока).Далее я показываю результат на Transcript.

...