簡體   English   中英

為什么不初始化該類/實例變量?

[英]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 ,然后初始化myClassinit ,然后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.

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