バリケンのRuby日記 RSSフィード

2006-05-21

[] Rubyの「変数」再考  Rubyの「変数」再考 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Rubyの「変数」再考 - バリケンのRuby日記  Rubyの「変数」再考 - バリケンのRuby日記 のブックマークコメント

以前の日記で『Rubyの変数は「オブジェクトに貼り付けるラベル」』というエントリを書いたけど、もういちど復習するよ。

他のプログラミング言語をすでに覚えた人は、たいてい『変数とは、値を入れておく「入れ物」のこと』と習っていると思うんだ。

でも、Rubyでは違うんだよ。「変数」は「オブジェクトに貼り付けておくラベル」なんだよ。

イメージとしては、次のような感じだよ。

f:id:muscovyduck:20060521220153p:image

たとえば、

foo = "Hello, world!"

と書いたときは、Stringオブジェクトにfooというラベルを貼り付けたことになるんだよ。イメージとしては、次のようになるよ。

f:id:muscovyduck:20060521220152p:image

そして、貼り付けたラベルをコード中で記述すると、そのオブジェクトを指し示したことになるんだよ。だから

foo = "Hello, world!"
puts foo

と書いたとき、「puts foo」は「foo」が指し示しているオブジェクトを「puts」する、という意味になるんだよ。

もうひとつ面白い例として、次のように書くと、

foo = "Hello, world!"
bar = foo

次のようなイメージになるんだよ。

f:id:muscovyduck:20060521220151p:image

bar = foo」の右側のfooは、fooというラベルが貼り付けられているオブジェクトのことを示しているから、そのオブジェクトbarというラベルも貼り付ける、という意味になるんだよ。

だから、次のように書くと、

foo = "Hello, world!"
bar = foo
bar.chop!
puts foo
puts bar

実行結果は次のようになるよ。

Hello, world
Hello, world

ひとつのオブジェクトに二つのラベルを貼り付けても、実体のオブジェクトはひとつだよ。だからbar.chop!(オブジェクトの最後の一文字を削除する)とすると、fooで参照してもやっぱり最後の一文字が削除されているんだよね。

同じ内容のオブジェクトコピーして別のラベルを貼り付けたいというときは、Object#cloneを使うよ。たとえば

foo = "Hello, world!"
bar = foo.clone

と書くと、fooというラベルが貼り付けられているオブジェクトコピーして、新たに増えたオブジェクトbarというラベルを貼り付ける、という意味になるよ。

イメージとしては、次のようになるよ。

f:id:muscovyduck:20060521222221p:image

だから、次のように書けば、

foo = "Hello, world!"
bar = foo.clone
bar.chop!
puts foo
puts bar

実行結果は次のようになるよ。

Hello, world!
Hello, world

こんどはfooが貼り付けられたオブジェクトbarが貼り付けられたオブジェクトは別物だから、bar.chop!とやってもfooの貼り付けてあるオブジェクトには変化がなかったんだね。

あと、「オブジェクト変数を貼り付けること」を「代入」と呼ぶみたいだよ。これは他のプログラミング言語変数は「入れ物」だから「代入」)の表現と合わせるためにそう呼んでいるだけで、あくまでもRubyでは「オブジェクト変数を貼り付けること」と脳内で変換してね。

Rubyの「変数」は「オブジェクトに貼り付けておくラベル」だというイメージ、つかめたかな?

mr-80bmr-80b2006/05/21 22:52目からウロコ。

mr-80bmr-80b2006/05/21 22:53非常によくわかりました。すばらしい解説ありがとうございます。

muscovyduckmuscovyduck2006/05/21 23:12id:mr-80bさん:
コメントありがとうございます!反応いただけると励みになります!