0
Help us understand the problem. What are the problem?

posted at

updated at

Rubyでのメソッドの戻り値について勘違いしていた

Rubyのメソッドの戻り値は、returnに渡した値です。

greeting.rb
class Greeting
  def name(num)
    if num == 1
      result = 'Tom'
    elsif num == 2
      result = 'Ken'
    else
      result = 'Yumi'
    end
    result
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
実行結果
Hello,Tom!!!
Hello,Ken!!!
Hello,Yumi!!!

上記の場合はreturnを省略していますが、
省略されているだけでresultreturnに渡っています。

そしてreturnを呼び出さない場合は、メソッド内の最後の式の値を
戻り値として返却するので、以下のように書いても同じ結果になります。

greeting.rb
class Greeting
  def name(num)
    if num == 1
      result = 'Tom'
    elsif num == 2
      result = 'Ken'
    else
      result = 'Yumi'
    end
    # result
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
実行結果
Hello,Tom!!!
Hello,Ken!!!
Hello,Yumi!!!

では、以下の場合はどうなるでしょうか。

greeting.rb
class Greeting
  def name(num)
    result = 'Yumi'
    if num == 1
      result = 'Tom'
    end
    if num == 2
      result = 'Ken'
    end
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
実行結果
Hello,!!!
Hello,Ken!!!
Hello,!!!

なんと、引数1, 3の結果はメソッドの戻り値が出力されていません。
'return'を呼び出さない場合は、メソッド内の最後の式の値を戻り値
として返却するので、if num == 2 ~ endの結果が返却されているのですね。
当たり前といえば当たり前なのですが、私は最初の例と同様の結果が得られると勘違いしていました。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?