重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Rubyの変数と代入演算は、メモリについてどのような扱いになっているのでしょうか。2点ほど疑問電があります。

1点目:代入演算は変数にアドレスを渡しているのか
RubyLifeのRuby入門のサンプルをみて学習していたところ疑問がわきました。
http://www.rubylife.jp/ini/var/index4.html を参照しながら示します。
str1 = "Tokyo"
str2 = str1
str1 << ",Japan"
とやるとstr1もstr2も"Tokyo,Japan"となることから、rubyでの代入演算はアドレスを代入してると考えました。


2点目:新しくオブジェクトを代入すると別メモリ領域において、そのアドレスを代入しているのか
str1 = "Tokyo"
str2 = str1
str1 = "Osaka"
とやると、str1は"Osaka"、str2は"Tokyo"となります。
前述の参照渡と考えるとstr2も"Osaka"となっているはずですが違いました。
ここで解説に(引用はじめ)
なお2つの変数が同じオブジェクトを指し示した後で、どちらかのオブジェクトに新しいオブジェクトを
代入した場合は、代入された変数が指し示すオブジェクトだけが変更されるだけです。(引用おわり)
とあります。
このことをふまえると、新しいオブジェクトを変数に代入するというのは、別のメモリ領域をつくってデータを置いてから、そのアドレスを変数に代入している、と考えました。

これら2つの考えと実際の仕組みは一致しているのでしょうか、と言うのが質問です。

質問点をまとめると、Rubyにおいて変数に対して
・代入演算はアドレスを代入しているのか(Cでいうポインタの扱いなのか)
・新しいオブジェクトを代入するときには、新メモリ領域を作ってデータを入れてそのアドレスを代入しているのか
という点です。

ついこの間はじめたばかりの初心者ですが、どうかご教授よろしくお願いいたします。

A 回答 (1件)

……えーと、ちっょと混乱してませんか?



まず、Ruby で扱ってるのはポインタでもアドレスでもなく参照です。
参照はポインタと違って演算することも直接値を指定することもできません。
というか、そういった危険な動作をできなくしたポインタ「のようなもの」です。

次に、あなたが提示された例ですが、C のポインタでも以下の通り動作は同じです。
int main(int argc, char** argv)
{
/* ポインタ参照先として用意 */
  int a1 = 1;
  int a2 = 2;
/* 使用するポインタ */
  int* p1;
  int* p2;

/* 1点目 */
  p1 = &a1;
  p2 = p1;
  p1 += 42;
  printf("p2が指す先の値 : %d\n", *p2); /* 結果は43 */

/* 2点目 */
  p1 = &a1;
  p2 = p1;
  p1 = &a2;
  printf("p2が指す先の値 : %d\n", *p2); /* 結果は 2 ではなく 43 */

  return 0;
}
    • good
    • 0
この回答へのお礼

混乱していました(笑)
書いてくださったCのコードを見て分かりました。
ありがとうございます。

お礼日時:2012/12/24 08:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!