[英]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"
您應該為 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.