【问题标题】:How to create a global variable in Squeak?如何在 Squeak 中创建全局变量?
【发布时间】:2009-05-21 11:38:39
【问题描述】:

我不是指类变量。我想要一个可以在任何地方使用的变量。 我应该在哪里定义它? [吱吱声]

【问题讨论】:

    标签: smalltalk squeak global-variables


    【解决方案1】:

    Squeak 将所有类实例和其他全局变量存储在名为“Smalltalk”的 SystemDictionary 中。你可以像这样定义一个全局变量:

    Smalltalk at: #variableName put: theValue.
    

    引用变量variableName 将返回theValue。

    然而,好的 Smalltalk 风格是完全避免全局变量。

    【讨论】:

    • 这是一种可能性,但 Smalltalkers 正在避免它,因为它非常危险。如果您错误地将变量命名为与某个现有类相同的变量,您将删除该类......这就是为什么即使在 Squeak 中这种方法也在慢慢贬值。其他 Smalltalks 没有它或有不同的方法。
    • Smalltalkers 更喜欢完全避免使用全局变量。
    【解决方案2】:

    一种方法是创建一个单例,如in this answer。

    一般来说,你会创建一个类变量和伴随的类方法来让某个对象成为全局可访问的。以上面提到的单例为例。然后从其他地方访问这样的变量:

    global := MyClass myGlobalVar
    

    要成为全局可更改的,请创建 mutator 类方法并将其称为:

    MyClass myGlobalVar: true
    

    还有其他方法,但是这个带有类变量的方法可以在 Smalltalk 方言中移植,因此从长远来看它是最安全的方法。

    【讨论】:

    • 好的,但我希望该对象存在于每个应用程序中。我考虑过将变量定义为元类“对象类”的类变量。这样这个对象就可以被使用了,对吧?你怎么看?
    • 我当然不会仅仅为了这个改变像 Object 和其他系统类这样重要的类。如果您要在多个应用程序中使用此变量,请使用此类创建一个通用包,该包将保存此变量。然后将此包作为所有其他包的先决条件与您的应用程序一起加载。现在,这被认为是 Smalltalk 中全局变量最合适的方式。
    • 我想这就是我的答案。我有几个问题: 1.在哪里定义访问方法?在“我的班级”中? 2.如何初始化变量?
    • 参见上面提到的单例示例。这可以扩展到任何这样的类变量。
    【解决方案3】:

    smalltalk 中的一个类是全球可用的,您可以随时更改它。只需创建一个类并将您的更改代码添加为类方法。然后,您可以通过调用访问您的资料

    MyVariable thisOrThat
    MyVariable updateThisOrThat: aThisOrThat
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多