【问题标题】:Can one create a standalone method/function (without any class)可以创建一个独立的方法/函数(没有任何类)
【发布时间】:2019-05-01 03:32:11
【问题描述】:

我正在尝试理解 smalltalk。是否可以有一个独立的方法/函数,它不属于任何特定类,并且可以稍后调用:

amethod ['amethod called' printNl]. 
amethod.

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

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

我该如何使用错误消息提示的EvalNamespace

我尝试了以下但没有工作:

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

Eval [... 有效,但我想为该块命名,以便稍后调用它。

Following 也有效,但会立即执行,稍后调用时不会执行。

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

感谢您的洞察力。

【问题讨论】:

    标签: smalltalk


    【解决方案1】:

    在 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 回答。

    【讨论】:

    • 这不能回答我的问题。我可以给这个块起一个名字,以便我以后可以调用它吗?另外,是否有参数可以发送到这个块的名称(如python中的常规函数​​)。
    • 在 Smalltalk 中,所有方法都应该在类中分组。没有类 - 没有方法。
    • @rnso:“我可以给这个块起个名字,以便我以后可以调用它吗?” – Smalltalk 有一个叫做“变量”的东西。您可以将对象分配给变量,这将允许您使用变量的名称来引用它。
    • @rnso:“另外,我可以将参数发送到这个块的名称吗?” - 是的,请参阅Leandro's answer中以“块也可能有参数”开头的段落。
    • 我明白了。有用。谢谢。如果您将此添加为答案,我会接受。
    【解决方案2】:

    Leandro 的回答虽然是正确的,并且对 smalltalk 有深刻的理解,但它正在回答您的要求,但我认为,不是 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 上显示结果。

    【讨论】:

      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 2020-11-19
      • 2022-06-30
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多