質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

883閲覧

参照の値渡しは変数がどのような型の時に行われるのか

tomoharu

総合スコア107

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/04/30 06:05

ruby で値渡しと 参照の値渡しについて勉強しました。
色々な記事を読んでみると、

rubyは基本的に参照の値渡しであると書いてありました。
ただ、例えば

x = 10 def add(a) a += 1 end add(10) #=> 11 p a #=> 10

これはただの値渡しだと思います。

しかし配列を引数に渡したりすると、参照の値渡しになると書いてありました。

配列以外に、どのような変数を扱うと参照の値渡しになるのでしょうか。
変数の型によって値渡しになったり、参照の値渡しになったりするのでしょうか。

何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これはただの値渡しだと思います。

いえ、これも(概念上は)参照の値渡しです。「10という数を表すインスタンス」を渡しています。

もっとも、「10という数を表すインスタンス」自体の状態を変える方法は存在しないので、単なる値を渡したのと同様に動作しています。

投稿2020/04/30 06:36

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/04/30 06:40

「10.class」とすれば「Number(古いRubyではFixnum)」と出るように、「10」も「あるオブジェクトのインスタンスを表すリテラル」です。
tomoharu

2020/04/30 07:01

ご回答ありがとうございます。ちょっと理解が及んでいないです。申し訳ありません。 この記事読んで勉強したのですが(https://magazine.rubyist.net/articles/0032/0032-CallByValueAndCallByReference.html)、 参照の値渡しが成立するためには、オブジェクトを定義し、それを変数に格納した際に、そのオブジェクトとは別に、そのオブジェクトのメモリ番地が入っているメモリ領域が確保されなければならないと理解しています。(配列を変数に代入して定義した時には、配列の中身を表すメモリ領域とは別にその配列の中身を参照するメモリ番地が入っているメモリ領域が確保されると理解しています。) ``` x = 10 ``` とした時ってxと10は同じメモリ領域であって、他にそのxを参照するメモリ領域は確保されないですよね? それでも参照の値渡しが可能なのかという感じです。。。 何卒よろしくお願いします。
maisumakun

2020/04/30 07:07

> xと10は同じメモリ領域であって いえ、違います。 やはりxには「10を指す情報」が入っています。一般的なRuby実装では、「10というオブジェクト」はメモリを消費せず、処理系が見せかけているだけのものですが、利用者がそれを気にする必要はありません。 また、同じ整数でも、x = 10**1000のような巨大な数を扱う場合は、メモリ上に実態が存在するオブジェクトとなります。こちらについては「同じ値だけど違うインスタンス」の整数を作ることも可能です。
tomoharu

2020/04/30 07:15

あそうなんですね! 確認なんですが、そうしたらxのメモリ領域に入る値は10のメモリ番地ということですか? ただ10はメモリを消費しないから正確にはメモリ番地ではなく、参照情報的な感じだとは思いますが。。 そうしたらxに入る値は参照情報だからxを引数で渡したら、参照の値渡しになるかなと思いました。
maisumakun

2020/04/30 07:23

> 確認なんですが、そうしたらxのメモリ領域に入る値は10のメモリ番地ということですか? そうですね、10だと「21」という値で参照しています(10.object_idで確認できます)。 普通のオブジェクトはメモリアドレスをもとにobject_idを作っていますが、メモリアドレスは32ビット環境だと4の倍数ごとに使う形となるので、残りが空いてしまいます。その隙間を使って、奇数を整数オブジェクトに割り当てています。
tomoharu

2020/04/30 08:02

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問