
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でいうポインタの扱いなのか)
・新しいオブジェクトを代入するときには、新メモリ領域を作ってデータを入れてそのアドレスを代入しているのか
という点です。
ついこの間はじめたばかりの初心者ですが、どうかご教授よろしくお願いいたします。
No.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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
jsp~jspにhiddenを使って変数...
-
EXCEL/VBA 変数の値をクリップ...
-
ASP+SQLにてSessionがNullになる
-
構造体からレコードセットへの代入
-
エラーの意味は? Lvalue req...
-
プログラムがわからないのですが
-
テーブルを固定し、文字列を折...
-
整数xxxが大き過ぎますというエ...
-
お願いします、教えてください...
-
VisualStudio2022でC言語プログ...
-
C言語 exitの使い方
-
VB6.0-整数と余りを求める
-
COLUMN(1:1)の意味を教え...
-
VBAのWorksheetFunctionの引数...
-
フォームを開くときに、コンボ...
-
C言語で全角文字を扱いたいので...
-
データ構造のmapとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jsp~jspにhiddenを使って変数...
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
EXCEL/VBA 変数の値をクリップ...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
整数xxxが大き過ぎますというエ...
-
stdpicture型の変数に、、
-
Accessコンボボックスにレコー...
-
verilog HDLの[=]と[<=]の使い分け
-
プログラミングで変数と関数の...
-
Borland C++ Compiler 5.5の警...
-
【VBA】複合代入演算子
-
gridViewの行選択解除
-
VBAでコマンドプロンプトの結果...
-
VBA 1行で複数の代入を行った...
-
C言語 アロー演算子について質...
-
DataTableの値を変数に代入したい
おすすめ情報