2011-11-10 5 views
3

これは私のコードです:printOnまたはStoreOnを使用して文字列に変換した22が、なぜ整数のように追加されるのはなぜですか?

x := 22 storeString. 
y := x + x. 
Transcript show: y. 

予想される出力:2222 実際の出力:44

私はXに割り当てられた22に送られたstoreStringメッセージは、文字列値であることになるだろうと思いましたxに格納されます。

だから、私は小さな話ではかなり新しいと思った。多分それは操作の順序ですか?私はprintOnの代わりstoreOnを使用する場合、

x := (22 storeString). 
y := x + x. 
Transcript show: y. 

同じ結果と同じ:だから私はこれを試してみました。これはおそらく、1日目のチュートリアルに続くタイプの質問です。しかし、何が起こっているのですか?連結演算子(、)について知っていることに注意してください。しかし、私はまだこのように2つの文字列をどのように追加できるのでしょうか?文字列から整数への暗黙の変換が+の一部として起こっていますか?

答えて

3

#+は、Stringに実装され、追加を行う前にNumberに強制されます。

Squeakには、コアコードベース全体にeToys(子供向けのスモールトークバリエーション)コードが多数あります。これは、Stringがすべての数式演算子を実装している理由です。 Pharoでは数学演算子はほとんどStringから削除されているので、'1' + '2'は他のSmalltalkのようにエラーを発生させます。

+0

今私には理にかなって:文字列の連結は、あなたが望むものである場合

ので、あなたは右のメッセージを送信する必要があります。フルーツループの色つきのおもちゃは、デフォルトのVM上では見えず(インスタンスが動作しています)、これ以上シークにはなりません(プロとバニラのように見えます)が、内部イメージビットは残っています。 –

4

Smalltalkには暗黙のものがいくつかあります。 Stringクラスの#+セレクタの実装をブラウズして、何が起こっているのかを調べることができます。またはString >> #+ definitionを印刷します。 実行中のオブジェクトインスタンスの内部もチェックすることができるので、x inspectを評価して、xが本当に文字列であることを知ることができます。

+0

良い点。私はこのように考えていませんでした。私は、「もっと小柄なことを考える」ということを学ぶいくつかの方法があるのがわかります。 –

3

ワークスペースを開きます。 「それはデバッグ」

12「」+「34」

ハイライトしてから起動するには、右ボタンメニューを使用します。入力します。 Smalltalkの「キラーアプリ」があったとしても、それはSmalltalkデバッガがSmalltalkの「すべてのオブジェクトすべて」オブジェクトとやり取りする方法です。すべてが何で、どのようにしているのかを見ることができます。 "into"を使用すると、それがどのように「46」に変換されるかを正確に見ることができます。

(と思う)であってもクーラーは、あなたが

12 + '34'

を(最初はもはや文字列ではなく、直接の数である)を行うことができるということです。繰り返しますが、デバッガを使用することができます。そして、スモールトークが超越的な数学を行うために使用する二重ディスパッチ機構全体があなたに開放されます。

あなたも

4.0 +#(「13」2)(ここでは配列に番号を追加している、と配列の内容は、混合型である)

のような奇妙な例を行うことができます

ハッピースモールトーク!

+0

ありがとうございます。これは私の(初心者の)レベルです。 –

2

この動作は、特に他の言語では正反対のことが起こりやすい(数字は文字列に強制される)ので、smalltalkに慣れていない人にとっては不思議に思えるかもしれません。

これは問題ではない理由は、文字列連結が,で行われているためです。それを一度認識すれば、'22' + 22または'22' + '22'も決して'2222'になることはありません。失敗するか、44を生成します。

x := 22 storeString. 
y := x , x. 
Transcript show: y. 
関連する問題