kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

クイズで学ぶ初心者がハマりがちなRubyの代入いろいろ

クイズ1

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a=100
b=a
b=200

答え

100

解説

  • a=100では、変数aに数値オブジェクト100を参照させている
  • b=aでは、変数bに変数aと同じオブジェクトを参照させている
  • そして、b=200では、変数bに数値オブジェクト200を参照させている
  • この時点で、変数abが参照するオブジェクトは異なるものとなる
  • そして、変数bが参照するオブジェクトが変わっても、変数aが参照するオブジェクトは変わらない

クイズ2

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a="aaa"
b=a
b.gsub!(/a/, "b")

答え

"bbb"

解説

  • gsub!はレシーバーの内容を直接書き換えるメソッド(破壊的メソッド)
  • gsub!は、文字列オブジェクト"aaa"に対して破壊的に実行される
  • b=aでは、変数bに変数aと同じ文字列オブジェクト"aaa"を参照させている
  • そのため、変数aからも、変数bからも書き換えられた文字列"bbb"を見ることができる

クイズ3

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a= ["aaa",100]
b=a[1]
b= 200

答え

["aaa", 100]

解説

  • クイズ1の応用問題
  • a[1]は配列の1個目要素を取り出すメソッド
  • b=a[1]では、変数ba[1]で取り出した、数値オブジェクト100を参照させている
  • そして、b=200では、変数bに数値オブジェクト200を参照させている
  • この時点で、a[1]と変数bが参照するオブジェクトは異なるものとなる
  • そして、変数bが参照するオブジェクトが変わっても、a[1]から取得できるオブジェクトは変わらない

クイズ4

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a= [ ["aaa","bbb"], 100]
b=a[0]
b[1] = "ccc"

答え

[["aaa", "ccc"], 100]

解説

  • こんどは、a[0]bは、配列オブジェクト ["aaa", "bbb"] を参照している
  • b[1] はメソッド Array#[]= の呼び出し
  • Array#[]=は、指定された配列の要素の中身を置き換えるメソッドのため、b[1] = "ccc" ならば ["aaa", "ccc"] となる