戻り値の話

関数から複数の値を返す方法
・配列そのものを戻り値とする
・returnで複数の値を指定する


return式で複数の値を返す方法では、Rubyが内部で配列を作成します。この配列は"[]"を置かなくてもいい。

こんな事が本に書いてあったのですが・・・。「returnで返す値は配列として初期化する必要がない」と思ってしまいました。なので、練習問題を解いたらパニックになりました。

こんなプログラムを書いてみた。
1から99までの数字をランダムで選び、要素数10個の配列を入れる。その配列を奇数配列(odd_number)と偶数配列(even_number)にわけて表示する。

def devide_array(array)

   for i in (0..9)
   ...(偶数奇数に分ける)...
   end

  return even_number, odd_number
end

array = []
...(arrayに199までの数字を入れる)...


#戻り値は2つ、実引数は1つ
even_number, odd_number = devide_array(array)

puts ("元の配列 : #{array}")
puts ("偶数配列 : #{even_number}")
puts ("奇数配列 : #{odd_number}")

当然エラーが出るわけです。even_numberとodd_numberがわからないと怒られるのです。Rubyが配列として内部で処理してくれるのは「returnで扱う値は配列となる」ではなく、「returnで返す時の複数の戻り値が配列となる」なんですね。
で、奇数配列・偶数配列を初期化しました。

1  def divide_array(array)
2  #
3  #↓even_number・odd_numberの初期化を追加した
4  #
5  even_number = []  #偶数を入れる配列
6  odd_number = []   #奇数を入れる配列


7    for i in (0..9)
   ...(偶数奇数に分ける)...
8    end

9    return even_number, odd_number
10 end

11 array = []
...(arrayに199までの数字を入れる)...


12 #戻り値は2つ、実引数は1つ
13 even_number, odd_number = divide_array(array)

14 puts ("元の配列 : #{array}")
15 puts ("偶数配列 : #{even_number}")
16 puts ("奇数配列 : #{odd_number}")

気になったのが、line13の前にeven_numberとodd_numberに配列の宣言がいらないこと。line13はdivide_array関数の戻り値を代入する、つまり、divide_array関数の戻り値にラベルをつけている。なので、配列の宣言をする必要がない。・・・らしい。

う〜ん・・・。これで本当に理解してるのだろうか・・・