ume

Rubyローカル変数と同名のメソッドについて

前書き

Rubyに関して新たな知見を得たので忘却録として記事に残します。

以下のコードを見て introduceメソッドの出力結果が 「僕ドラえもん」か「野比のび太」どちらが出力されるかわからない方はこのまま記事を読み進めてください。

class User
  def name
    "僕ドラえもん"
  end 

  def introduce(name) 
   puts name   
  end 
end 

user = User.new 
user.introduce("野比のび太")
#出力結果は何?

introduce()メソッド内のnameはメソッドとして認識される?それともnameというローカル変数として認識される?

結論

上記の例の場合introduce内のnameは「ローカル変数」として認識され出力結果は「野比のび太」と出力される。

ローカル変数とメソッドの見分け方

ローカル変数として認識される場合は以下のような時.
  1. メソッド内で変数が定義されている
class User
  def name
    "僕ドラえもん"
  end 

  def introduce
    name = "野比のび太" #ローカル変数定義  
    puts name
  end 
end 

user = User.new 
user.introduce
出力結果 野比のび太
  1. メソッドの引数になっている場合
class User
  def name
    "僕ドラえもん"
  end 

  def introduce(name)  #メソッドの引数になっている時ローカル変数として処理される
   puts name   
  end 
end 

user = User.new 
user.introduce("野比のび太")
出力結果 野比のび太
メソッドとして認識される場合は以下の時
  1. ローカル変数の条件以外
class User
  def name
    "僕ドラえもん"
  end 

  def introduce
   puts name   
  end 
end 

user = User.new 
user.introduce
#出力結果 僕ドラえもん

まとめ

  • ローカル変数と同名のメソッド名を定義しない方が可読性が高まりる

参考情報

現場で使える Ruby on Rails 5速習実践ガイド | マイナビブックス