Smalltalk 可以创建一个独立的方法/函数(没有任何类)
我在试着理解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
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.