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

时间:2019-05-01 03:32:12

标签: smalltalk

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

amethod ['amethod called' printNl]. 
amethod.

以上代码给出以下错误:

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

如何根据错误消息的建议使用EvalNamespace

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

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

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

以下操作也有效,但会立即执行,以后再调用时不会执行。

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

感谢您的见识。

2 个答案:

答案 0 :(得分:5)

在Smalltalk中,等效于独立方法的是Block(又称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"

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

答案 1 :(得分:2)

Leandro的答案虽然是正确的并且具有深刻的小话题理解,但它正在回答您的要求,但是我认为,并不是100%确定您,您实际上是在询问如何“玩弄”代码而无需创建一个班级。

在我眼中,您想要的被称为 Workspace (Smalltalk / X和Dolphin)(在Pharo Smalltalk中,它可以有不同的名称,例如Playground)。

如果要玩耍,需要创建一个局部变量。

| 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上显示结果。