我正在尝试了解小道消息。是否可以有一个独立的方法/函数,它不属于任何特定类,以后可以调用:
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].
感谢您的见识。
答案 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
上显示结果。