2016-05-14 4 views
2

私はちょうど次の動作を見つけました。それを再現するには、インストのVARを持つクラスを作成します。Squeak Smalltalkアレイでの不思議な動作

Object subclass: #Asdf 
    instanceVariableNames: 'countSeq' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'Asdf' 

そして怠惰-INITゲッター:これは正しく動作

countSeq 
^countSeq ifNil: [ 
    countSeq:=#(0) asOrderedCollection. 
    countSeq at: 1 put: (countSeq at: 1)+1. 
    countSeq 
]. 

。私はAsdf new countSeqと呼ぶと毎回an OrderedCollection(1)を返します。

私はasOrderedCollectionを削除する場合は、:

countSeq 
^countSeq ifNil: [ 
    countSeq:=#(0). 
    countSeq at: 1 put: (countSeq at: 1)+1. 
    countSeq 
]. 

そしてAsdf new countSeqを複数回呼び出し、それから私は... #(1)#(2)#(3)を取得します。 これはどのように説明できますか?

(この配列は、C静的ローカル変数のように動作しているかのようにそれはのように私には見えます実際には、私はそれを試してみた:メソッドを再コンパイルし、不幸なカウンタが再び1から始まる)

+0

は、リンクされた質問 –

答えて

3

これはあるのでリテラル配列#(0)はメソッドオブジェクトの内部に格納されます。

は、ここで説明:Why shouldn't I store into literal arrays in Smalltalk?

+0

はい、言語の実際の落とし穴でトビアスさんとblabla999の両方の回答を参照してください。 –

+1

Upvoted Tobiasの答えは彼が参照しているページで、私は誰もが完全にそれを読むことをお勧めします。 –

+1

@BerndElkemannそれは言語の落とし穴ではなく、オブジェクトで構成されたシステムを持っていることの結果です。私たちのOO思考がテキストベースの推論を克服すると、その動作は自然になります。 –

関連する問題