可以创建独立的方法/功能(没有任何类)

问题描述 投票:3回答:2

我想了解smalltalk。是否有可能有一个独立的方法/函数,它不是任何特定类的一部分,可以在以后调用:

amethod ['amethod called' printNl]. 
amethod.

上面的代码给出以下错误:

simpleclass.st:1: expected Eval, Namespace or class definition

如何通过错误消息建议使用EvalNamespace

我试过以下但没有工作:

Eval amethod [...
amethod Eval [...
Eval amethod Eval[...        "!"

Eval [...工作,但我想给块名,以便我以后可以调用它。

以下也可以工作,但会立即执行,稍后调用时不会执行。

Namespace current: amethod ['amethod called' printNl]. 

感谢您的见解。

smalltalk
2个回答
5
投票

在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


2
投票

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:上显示结果。

© www.soinside.com 2019 - 2024. All rights reserved.