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

Smalltalk 可以创建一个独立的方法/函数(没有任何类),smalltalk,Smalltalk,我在试着理解smalltalk。是否可以有一个独立的方法/函数,它不是任何特定类的一部分,以后可以调用: amethod ['amethod called' printNl]. amethod. 上述代码给出了以下错误: simpleclass.st:1: expected Eval, Namespace or class definition 如何使用错误消息建议的Eval或名称空间 我试过以下方法,但没有效果: Eval amethod [... amethod Eval [... E

我在试着理解smalltalk。是否可以有一个独立的方法/函数,它不是任何特定类的一部分,以后可以调用:

amethod ['amethod called' printNl]. 
amethod.
上述代码给出了以下错误:

simpleclass.st:1: expected Eval, Namespace or class definition
如何使用错误消息建议的
Eval
名称空间

我试过以下方法,但没有效果:

Eval amethod [...
amethod Eval [...
Eval amethod Eval[...        "!"
Eval[…
有效,但我想给块起个名字,以便以后调用它

Following也可以工作,但会立即执行,稍后调用时不会执行

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

感谢您的见解。

在Smalltalk中,与独立方法等效的是
块(也称为
块闭包
)。您可以通过将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].

Leandro的回答虽然正确且对smalltalk有深刻的理解,但它回答了你的问题,但我认为,你不是100%确定,你实际上是在问如何在不需要创建类的情况下“玩”代码

在我看来,want you want被称为一个工作区(Smalltalk/X和Dolphin)(它可以有不同的名称,比如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.
说明:


我正在为
1-10
迭代使用
do:
块。(
:integer
是块局部变量)。接下来,我将在
Transcript

上显示结果,但这并没有回答我的问题。我可以给这个块起个名字,以便以后调用它吗?还有,我可以用它的名字向这个块发送参数吗(就像python中的常规函数一样)。在Smalltalk中,所有方法都应分组在类中。无类-无方法。@rnso:“我可以给这个块起个名字,以便以后调用它吗?”–Smalltalk有一个称为“变量”的东西。您可以给变量分配一个对象,这将允许您使用变量的名称引用它。@rnso:“还有,我可以用它的名字将参数发送到这个区块吗”-是的,请参阅中以“区块可能也有参数”开头的段落。我明白了。它有效。谢谢。如果你将此作为答案添加,我将接受它。
| 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.