* 初投稿 返り値について初めて躓いたのでメモ
そもそも、「返り値とは、プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値」である。
[1] pry(main)> puts "hello world"
hello world
=> nil
puts でhello worldを出力させています。
注意ですが、「hello world はputsによってコンソールに標準出力されただけで、返り値ではない」ということです。
ここでの返り値は、=> nil です。これは、putsに対しての返り値になります。
公式によると、
putsはRubyで何かを出力する基本的なコマンドです。 では、=> nilは何でしょうか? これはこのコマンドの評価結果です。 putsは必ずnilを返します。nilは、「まったく何もない」ことを表すRubyの「値」です。
では、次にメソッド hogeを下記のように定義し実行してみます。
[13] pry(main)> def hoge
[13] pry(main)* puts "hello world"
[13] pry(main)* end
=> :hoge
実行してみると、
[15] pry(main)> hoge
hello world
=> nil
ここで一つ疑問がでます。
それは, hello world はメソッド hoge の「返り値」なのかどうかです。
冒頭で説明した、
「返り値とは、プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値」だとすれば、メソッド hoge の返り値はhello worldなのか?!?!?!?
結論からいうとメソッド hoge の「返り値」はnilです。
変数aにメソッドhogeの返り値を代入してみます
[59] pry(main)> def hoge
[59] pry(main)* puts "hello world"
[59] pry(main)* end
=> :hoge
[60] pry(main)> a = hoge
hello world
=> nil
[62] pry(main)> a
=> nil
次に、変数bにメソッドfugaの返り値を代入してみます
[70] pry(main)> def fuga
[70] pry(main)* puts "good night world"
[70] pry(main)* return "new world"
[70] pry(main)* end
=> :fuga
[71] pry(main)> b = fuga
good night world
=> "new world"
[72] pry(main)> b
=> "new world"
ここで分かるのは、
変数aに代入されているのは => nil
変数bに代入されているのは => "new world"
それぞれhoge, fugaの返り値が代入されているのがわかります。
メソッド fuga では、
puts "good night world"でコンソールに標準したあと、return で指定された"new world"返り値として戻ってきています。
また、
hoge2 という何も処理のない(返す値のない) メソッドを定義し、変数cに代入してみます。
[74] pry(main)> def hoge2
[74] pry(main)* end
=> :hoge2
[75] pry(main)> c = hoge2
=> nil
[76] pry(main)> c
=> nil
変数cにはメソッド hoge2の返り値=> nilが代入されています。
ここまでで分かるのは、メソッドはreturnなりで、返す値を指定されていない場合、返り値がないので、
=> nil
を返り値として返します。
つまり、putsがnilを返すのも同じ理由です。
余談ですが、
putsと同じようなものに、pメソッドというものもあります。
[102] pry(main)> p "test"
"test"
=> "test"
こちらは標準出力をしたあと、返り値としても指定した文字列が返ってきます。