我正在尝试了解闲聊。是否可以有一个独立的方法/函数,它不属于任何特定类,以后可以调用:
amethod ['amethod called' printNl].
amethod.
Run Code Online (Sandbox Code Playgroud)
上面的代码给出以下错误:
simpleclass.st:1: expected Eval, Namespace or class definition
Run Code Online (Sandbox Code Playgroud)
如何使用Eval或Namespace出现错误提示?
我尝试了以下操作,但无济于事:
Eval amethod [...
amethod Eval [...
Eval amethod Eval[... "!"
Run Code Online (Sandbox Code Playgroud)
Eval [... 可以,但是我想给块起个名字,以便以后使用。
Follow也可以工作,但立即执行,以后再调用时不执行。
Namespace current: amethod ['amethod called' printNl].
Run Code Online (Sandbox Code Playgroud)
感谢您的见解。
在Smalltalk中,等效于独立方法的是Block(aka BlockClosure)。您可以通过将Smalltalk表达式放在方括号之间来创建它们。例如
[3 + 4]
Run Code Online (Sandbox Code Playgroud)
要评估一个块,请向其发送消息value:
[3 + 4] value
Run Code Online (Sandbox Code Playgroud)
这将回答7。
块也可能有参数:
[:s | 3 + s]
Run Code Online (Sandbox Code Playgroud)
你用 value:
[:s | 3 + s] value: 4 "answers with 7"
Run Code Online (Sandbox Code Playgroud)
如果该块包含多个句子,则可以用点将它们分开,就像在方法主体中所做的那样。
Smalltalk中的块是一流的对象。特别是,可以用变量引用它们,而对其他任何对象都可以引用它们:
three := 3.
threePlus := [:s | three + s].
Run Code Online (Sandbox Code Playgroud)
供以后使用
threePlus value: 4 "7"
Run Code Online (Sandbox Code Playgroud)
块可以嵌套:
random := Random new.
compare := [:p :u | u <= p]
bernoulli60 := [compare value: 0.6 value: random next].
Run Code Online (Sandbox Code Playgroud)
然后序列:
bernoulli60 value. "true"
bernoulli60 value. "false"
...
bernoulli60 value. "true"
Run Code Online (Sandbox Code Playgroud)
true大约有60%的时间会回答。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |