如何在Squeak中创建全局变量?

4

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

3个回答

6
Squeak将所有类实例和其他全局变量存储在名为“Smalltalk”的SystemDictionary中。您可以像这样定义全局变量:
Smalltalk at: #variableName put: theValue.

引用变量variableName将返回theValue

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


1
这是一种可能性,但Smalltalk程序员正在避免使用它,因为它非常危险。如果您不小心给一个变量命名与某个现有类相同,您将删除该类...这就是为什么即使在Squeak中,这种方法也在逐渐消失。其他Smalltalk没有这个功能或者实现方式不同。 - Janko Mivšek
1
Smalltalk 程序员更喜欢完全避免使用全局变量。 - Nat

4

一种方法是创建一个单例,就像这个答案中所示。

通常情况下,您需要创建一个类变量和相应的类方法,以使某些对象成为全局可访问的。请参考上述单例示例。然后从其他地方访问此变量:

global := MyClass myGlobalVar

为了实现全球化,创建修改器类方法并按以下方式调用它:
MyClass myGlobalVar: true

还有其他方法,但使用类变量的方法在Smalltalk方言之间是可移植的,从长远来看,这是最安全的方式。


好的,但我希望这个对象存在于每个应用程序中。我考虑将变量定义为元类'Object class'的类变量。这样这个对象就可以被共用,对吗?你觉得呢? - Renne
1
我肯定不会为此更改像Object和其他系统类这样重要的类。如果您在多个应用程序中使用此变量,请创建一个包含此类的公共包,该包将保存此变量。然后将此包作为所有应用程序包的先决条件加载。这是Smalltalk中全局变量最合适的方式。 - Janko Mivšek
我认为这是我的答案。我有几个问题:
  1. 在哪里定义访问方法?在“MyClass类”中吗?
  2. 我如何初始化变量?
- Renne
请参考上述单例示例。这可以扩展到任何类变量。 - Janko Mivšek

1

在Smalltalk中,一个类是全局可用的,你可以随时更改它。只需创建一个类并将您的修改代码作为类方法添加即可。然后,您可以通过调用来访问您的内容

MyVariable thisOrThat
MyVariable updateThisOrThat: aThisOrThat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接