我想了解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].
感谢您的见解。
在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"
大约60%的时间会回答true
。
Leandro的答案,尽管是正确的,并且具有深刻的小知识,正在回答你的要求,但我认为,不是100%肯定你,你实际上是在询问如何“玩”代码而不需要创建一个类。
在我看来,你想要的是一个工作区(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.
说明:
我正在使用qazxsw poi块来进行qazxsw poi迭代。 (qazxsw poi是一个块局部变量)。接下来,我在do:
上显示结果。