2

ドキュメントにある GNU Smalltalk の例を実行しようとしましたが、問題が発生しました。

Object subclass: Account [
  | balance |
  new [
    | r |
    r := super new.
    r init.
    ^r
  ]
  init [
    'initialize account' printNl.
    balance := 0
  ]
  get [
    ^balance
  ]
]

newメソッドでは、initメッセージがメソッドに送信されることはありませんAccount。私の出力は次のとおりです。

st> Account new get
nil
st> Account new init get
'initialize account'
0

この例はGNU Smalltalk Documentationから引用しました。

誰かがエラーを見つけるのを手伝ってくれますか? おそらくinitsuperのメソッドが呼び出されていると思いましたが、メソッドがObjectありませんinit。さらにsuper、現在のクラスのインスタンスを作成する必要がありますか?

答えてくれてありがとうベンジャミン

So my problem was that i did not distinguish between class functions (new) and Object functions

Fixed Code

Object subclass: Account [
  | balance |
  init [ balance := 0 ]
  get [ ^balance ]
]
Account class extend [
  new [ ^ (super new init) ]
]


st> Account new get
0
4

3 に答える 3

3

コードにわずかな変更を加えたため、動作しません。

Smalltalk では、メソッドは 2 つの場所のいずれかにアタッチできます:クラスのインスタンスに適用できます。この場合、アカウント オブジェクト (実行から返されるオブジェクトなど) になります。または、クラスメソッドにするAccount newことができます。つまり、それらは実際のクラス自体に適用されます。Account

Account initインスタンスメソッドです。Account作成したクラスのインスタンスに適切なデフォルトを設定します。あなたはそれを正しく書きました、そしてそれはあるべきように振る舞います。

一方、Account newクラス メソッドからインスタンス メソッドに変更しました。Accountクラス メソッドの場合、既存のnewメソッドを を呼び出すメソッドに置き換えますinit。インスタンスメソッドの場合、インスタンスで呼び出すことはないため、実際には何もしませんnew

new修正は簡単です。メソッドがクラス メソッドであることを GNU Smalltalk に伝えます。そのためには、メソッドをクラスAccount class >> new内で緩むのではなく、オンにするだけです。Account

于 2011-04-10T22:25:49.687 に答える
2

最初newはですAccount class >> new。ありがとう!

于 2011-04-10T19:27:52.907 に答える
1

別の可能性は次のとおりです。

Object subclass: Account [
    | balance |
    Account class [
        new [
          ...
        ]

        otherClassMethod [
          ...
        ]
    ]

    instanceMethod [
      ...
    ]
]
于 2011-04-13T15:03:28.147 に答える