3

私は Smalltak の初心者ですが、論文のためにいくつかのことを理解する必要があります。文字列やその他のオブジェクトを作成するとき、正確には何が起こっているのでしょうか? たとえば、次のようにします。

fruit <- 'apple'

オブジェクトの果物を調べてみると、5 つの inst vars があることがわかります。「ナシ」を果物に割り当てた場合、4 つの inst vars があったことになります。インタープリターはバイト文字列の新しいインスタンスを作成し、すべての文字に必要な inst 変数を追加し、それらに適切な値を割り当てましたか? もっと何かが起こっていると思いますが、どこにも見つけられず、smalltalk を適切に学習する時間がありません。説明してもらえますか、それとも見つけられるリンクを教えてください。

4

4 に答える 4

5

文字列はオブジェクトです。オブジェクトにはインスタンス変数が含まれ、メッセージに応答します。Smalltalkには、基本的に2種類のインスタンス変数があります。名前付きインスタンス変数は名前で参照され(PersonオブジェクトのnameやphoneNumberなど)、インデックス付きインスタンス変数は番号で参照されます。文字列はインデックス付きのインスタンス変数を使用します。

次の例を考えてみましょう。

fruit := String new: 5.
fruit at: 1 put: $a;
    at: 2 put: $p;
    at: 3 put: $p;
    at: 4 put: $l;
    at: 5 put: $e.

これにより、5文字のスペースを持つ文字列が作成されます。次に、そのオブジェクトを指すフルーツ変数を取得します。次に、文字列に5文字を書き込みます。結果は文字列'apple'です。

文字列は非常に一般的に使用されるため、コンパイラはコンパイル時に文字列を作成するための特別な構文をサポートします。

fruit := 'apple'

この例では、「apple」は文字列リテラルです。Smalltalkコンパイラは、行をコンパイルするときに文字列を作成します。この行を実行すると、Characterオブジェクトを含む5つのインデックス付きインスタンス変数を持つ文字列'apple'を実感させることができます。

于 2012-05-17T01:28:44.370 に答える
4

それらはインスタンス変数ではなく、インデックス可能なオブジェクト内の位置であり、配列やその他の種類のコレクションを作成するときに起こることとよく似ています。

Smalltalk における文字列は、単なる文字のコレクションであり、各文字は文字列内の位置に格納されます。

文字列が配列と同じであることを理解するためのいくつかの例:

'Good Morning' at: 3.
#(1 'hi' $d 5.34) at: 3.

'Good Morning' fourth.
#(1 'hi' $d 5.34) fourth.

'Good Morning' reversed.
#(1 'hi' $d 5.34) reversed.

'Good Morning' select: [ :each | each ~= $d ].
#(1 'hi' $d 5.34) select: [ :each | each ~= $d ].

ご覧のとおり、文字列は単なる別の種類のコレクションです。

于 2012-05-16T20:55:31.867 に答える
3

文字列はインデックス可能なオブジェクトです。つまり、文字列は配列であり、スロットには「ラベル付け」ではなく番号が付けられます...

于 2012-05-16T20:40:44.190 に答える
2

まず、例として挙げた式は文字列を作成しません。単純な割り当てです。

fruit := 'apple'

文字列を作成しません。既存の文字列 'apple' を fruit 変数に割り当てます。新しい文字列を作成する場合は、Array new: と同様に (Byte)String new: を使用する必要があります。

これは、ソース コードをコンパイルするときにコンパイラが実際に新しい文字列を作成する方法です。

于 2012-05-16T22:42:18.440 に答える