可以创建一个独立的 method/function(没有任何 class)
Can one create a standalone method/function (without any class)
我正在尝试了解 smalltalk。是否可以有一个独立的 method/function,它不是任何特定 class 的一部分,并且可以稍后调用:
amethod ['amethod called' printNl].
amethod.
以上代码给出以下错误:
simpleclass.st:1: expected Eval, Namespace or class definition
如何按照错误消息的建议使用 Eval
或 Namespace
?
我试过以下但 none 有效:
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 中的块首先是 class 个对象。特别是,可以用变量引用它们,与任何其他对象相同:
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 的回答,尽管是正确的并且对 smalltalk 有深刻的理解,正在回答你的要求,但我认为,你不是 100% 确定,你实际上是在问如何 "play" 使用代码而不需要创建一个class.
在我看来,你想要的被称为 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
.
上显示结果
我正在尝试了解 smalltalk。是否可以有一个独立的 method/function,它不是任何特定 class 的一部分,并且可以稍后调用:
amethod ['amethod called' printNl].
amethod.
以上代码给出以下错误:
simpleclass.st:1: expected Eval, Namespace or class definition
如何按照错误消息的建议使用 Eval
或 Namespace
?
我试过以下但 none 有效:
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 中的块首先是 class 个对象。特别是,可以用变量引用它们,与任何其他对象相同:
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 的回答,尽管是正确的并且对 smalltalk 有深刻的理解,正在回答你的要求,但我认为,你不是 100% 确定,你实际上是在问如何 "play" 使用代码而不需要创建一个class.
在我看来,你想要的被称为 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
.