おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

メソッドとローカル変数はどちらが優先されるのか?

ruby内で、selfは基本的に省略可能なのですが、

  self.hoge = "hoge"

のように、"=" 付きのメソッドの時はselfの省略ができません。省略した場合は、ローカル変数への代入となります。


とすると、下記のような時、どちらの値が出力されるのでしょうか。

  self.hoge = "self"
  hoge = "local"
  p hoge

試してみました。

class Hoge
  def initialize
    @hoge = nil
  end
  
  def hoge
    @hoge
  end
  
  def hoge=(val)
    @hoge = val
  end
  
  def local_and_self
    self.hoge = "self"
    hoge = "local"
    p hoge
    p self.hoge
  end
  
  def self_only
    p hoge
  end
end

hoge = Hoge.new
p "local_and_self"
hoge.local_and_self
p "self_only"
hoge.self_only

実行結果

ruby hoge.rb
"local_and_self"
"local"
"self"
"self_only"
"self"

というわけで、ローカル変数が設定されている場合はそちらが優先になるみたいです。