[英]Why this class/instance variable is not being intialized?
我正在嘗試使用gnu-smalltalk。 在帶有變量的簡單類的以下代碼中,我發現它沒有被初始化為給定值:
Object subclass: Myclass[
|mainval|
mainval := 555.
getmainval [^mainval]
]
gc := Myclass new.
gc getmainval printNl.
該對象被創建而沒有任何錯誤。 但是,輸出為:
nil
而我原以為是555。
如果我添加了一個為它分配值的方法,並在創建該類的實例后調用了它,那么它將起作用。
問題出在哪里,如何解決? 謝謝。
我認為您很親密,但是您嘗試了一種無法使用的快捷方式,原因是您期望在類定義(方法和局部有效性之外)中的實例變量設置值將返回值。 實際上,您想在方法(例如init
使用實例變量來表達對象的內部狀態。
正如我在之前的回答中所指出的那樣,我不是GNU Smalltalk專家。 我正在使用Smalltalk / X-jv分支進行編程。
我已自由地將您的代碼重寫為更多的GNU Smalltalk,如代碼:
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
MyClass class >> new [
<category: 'instance creation'>
| myClass |
myClass := super new.
myClass init.
^ myClass
]
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]
說明:
我正在定義mainVal
實例變量。 然后我重新定義一個類的方法new
則不需要 ,但是為了說明我這樣做。 (該new
消息被從繼承Object
類)
我在class new
方法中正在做什么。 我送了new
消息到superclass
它創建的實例anObject
,然后初始化myClass
與init
,然后returing它。
之后,您會看到init
類,該類將實例變量初始化為所需的555
值。
然后,您有一個getVal(在Smalltalk中,通常沒有get前綴,但這只是樣式的問題) mainVal
。
然后您的代碼調用該對象並獲得價值。
gc := MyClass new.
gc mainVal
該小例子,沒有new
消息,重新定義:
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]
你一定不要忘記是什么在Smalltalk中通常有一個構造函數,因此你要發送的沒有默認調用init
手動消息(另一個選項是重新定義new
像我上面那樣的消息)。
然后使用它看起來像這樣:
gc := MyClass new.
a MyClass
st> gc init
a MyClass
st> gc mainVal
555
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.