Edited at

ruby 返り値 と nil

* 初投稿 返り値について初めて躓いたのでメモ

 そもそも、「返り値とは、プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値」である。

[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"

こちらは標準出力をしたあと、返り値としても指定した文字列が返ってきます。