プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

ローカル変数が優先される処理と、selfによる明示的なメソッド呼び出し

レシーバ省略とローカル変数

ちゃんと理解したことを記録するためにもメモ。 こんなコードがあるとします。

class Laputa
  def hover
    vibrate
  end

  def vibrate
    p "vibrate"
  end
end

l = Laputa.new
l.hover #=> "vibrate"

l.hoverは当たり前のように"vibrate"を返します。 ここではLaputa#hoverを呼び出した際、Ruby側がvibrateをメソッド呼び出しと解釈しています。

もしvibrateをメソッドと解釈できなかったら

Laputa#hoverにvibrateというローカル変数をもたせた場合、vibrateはメソッドとして解釈されません。l.hoverの結果は何も返ってきません。

class Laputa
  def hover
  vibrate = 0
    vibrate
  end

  def vibrate
    p "vibrate"
  end
end

l = Laputa.new
l.hover #=> ””

メソッドを呼び出すには

レシーバ省略といって、最初のコードの際にも暗黙のselfが呼び出されていました。 ローカル変数との重複があっても、メソッドとして動かしたい場合は上記のvibrateの呼び出しを以下のように書き換えます。

self.vibrate

明示的にselfにすることでメソッドとして解釈してもらいます。