可以创建一个独立的方法/函数(没有任何类)

rns*_*nso 3 smalltalk

我正在尝试了解闲聊。是否可以有一个独立的方法/函数,它不属于任何特定类,以后可以调用:

amethod ['amethod called' printNl]. 
amethod.
Run Code Online (Sandbox Code Playgroud)

上面的代码给出以下错误:

simpleclass.st:1: expected Eval, Namespace or class definition
Run Code Online (Sandbox Code Playgroud)

如何使用EvalNamespace出现错误提示?

我尝试了以下操作,但无济于事:

Eval amethod [...
amethod Eval [...
Eval amethod Eval[...        "!"
Run Code Online (Sandbox Code Playgroud)

Eval [... 可以,但是我想给块起个名字,以便以后使用。

Follow也可以工作,但立即执行,以后再调用时不执行。

Namespace current: amethod ['amethod called' printNl]. 
Run Code Online (Sandbox Code Playgroud)

感谢您的见解。

Lea*_*lia 5

在Smalltalk中,等效于独立方法的是Block(aka BlockClosure)。您可以通过将Smalltalk表达式放在方括号之间来创建它们。例如

[3 + 4]
Run Code Online (Sandbox Code Playgroud)

要评估一个块,请向其发送消息value

[3 + 4] value
Run Code Online (Sandbox Code Playgroud)

这将回答7

块也可能有参数:

[:s | 3 + s]
Run Code Online (Sandbox Code Playgroud)

你用 value:

[:s | 3 + s] value: 4  "answers with 7"
Run Code Online (Sandbox Code Playgroud)

如果该块包含多个句子,则可以用点将它们分开,就像在方法主体中所做的那样。


附录

Smalltalk中的块是一流的对象。特别是,可以用变量引用它们,而对其他任何对象都可以引用它们:

three := 3.
threePlus := [:s | three + s].
Run Code Online (Sandbox Code Playgroud)

供以后使用

threePlus value: 4    "7"
Run Code Online (Sandbox Code Playgroud)

块可以嵌套:

random := Random new.
compare := [:p :u | u <= p]
bernoulli60 := [compare value: 0.6 value: random next].
Run Code Online (Sandbox Code Playgroud)

然后序列:

bernoulli60 value.  "true"
bernoulli60 value.  "false"
...
bernoulli60 value.  "true"
Run Code Online (Sandbox Code Playgroud)

true大约有60%的时间会回答。