戻り値の話
関数から複数の値を返す方法 ・配列そのものを戻り値とする ・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に1〜99までの数字を入れる)... #戻り値は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に1〜99までの数字を入れる)... 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関数の戻り値にラベルをつけている。なので、配列の宣言をする必要がない。・・・らしい。
う〜ん・・・。これで本当に理解してるのだろうか・・・