簡體   English   中英

在 Pharo Smalltalk 中初始化 Class 變量

[英]Initialize Class variables in Pharo Smalltalk

我在 Pharo 中初始化 class 變量時遇到問題。 我首先使用單個 class 變量創建 class :

Object subclass: #ClassVariableTestBehavior
    instanceVariableNames: ''
    classVariableNames: 'test'
    package: 'DummyPackage'

然后在 class 端,我創建了一個initialize消息並將變量設置為 nil。

ClassVariableTestBehavior class >>> initialize
    test := nil

我保存然后創建了一個實例方法:

ClassVariableTestBehavior >>> test
    ^ test

並再次返回並將 class 方法更改為:

ClassVariableTestBehavior class >>> initialize
    test := 34

然后在操場上打印以下結果:

ClassVariableTestBehavior new test.

這是nil 為什么 class 變量的值沒有更新為 34?

當代碼最初從外部文件加載時, class>>initialize方法只使用一次。 它不會在每次編輯方法時運行。 (如果您修改了注釋,您是否希望數據被清除?)事實上, nil值並非來自您的方法,而只是初始默認值。

一個常見的約定是使用一行可以執行的代碼向初始化方法添加注釋。

"
ClassVariableTestBehavior initialize.
"

我認為您對初始化感到困惑。 根據您的評論,您希望創建一個在實例之間共享的常量值。

initialize通常是一種定義值的方法,例如您正在創建的 object。 Smalltalk 的問題在於,並非每個 Smalltalk 實現在創建實例時都會運行initialize 所以要小心這個。

如果您想在實例之間共享價值,您可以創建一個 class 方法,如下所示:

ClassVariableTestBehavior class >> #test

在哪里:

test
  "Class method returning always the same value"
  ^ 34

當您想訪問該值時,您只需執行以下操作:

ClassVariableTestBehavior test.

如果您想在創建自己的實例時訪問它,您可以這樣做:

| instance |
instance := ClassVariableTestBehavior new.
instance class test. "This accesses the class variable"

編輯- 由於 Leandro 的出色評論,我忘了提及。

您應該為 class 變量使用大寫字母! (歸功於萊安德羅)

如果您想將一個值存儲在 class 變量中,而不是像上面所示的方法中的常量值。 您可以使用 class 變量來實現。

如果您將 class 變量定義為Test ,那么您需要為其設置一個 getter 和 setter。

你將會擁有:

ClassVariableTestBehavior class >> #test

test
  "returns value of class variable"
  ^ Test

ClassVariableTestBehavior class >> #test:

test: aNumber
  "sets the value of class variable"
  Test := aNumber

您將以與上述相同的方式訪問該值(就在編輯之前)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM