ローカル変数とかスコープとかメソッドとか

ローカル変数と等号付きメソッド

レシーバを省略するとメソッドではなくローカル変数として扱われます。普通のメソッドはselfのレシーバを省略できますが、この場合は不可。

プログラミング言語 Ruby リファレンスマニュアル
class Foo
   def bar=(v)
   end
   def baz
      bar = 0           # ローカル変数 bar への代入
      self.bar = 0      # メソッド bar= の呼び出し
   end
end

今日初めて知りましたスイマセン…。

どこら辺で効いてくるかといえばARの辺りだと思う

class MyVideo < ActiveRecord::Base
  def set_title_aa
    title = "aa" #ただローカル変数に代入してるだけ
  end
  
  def set_title_aaa
    self.title = "aaa" #メソッドを呼び出してる
  end

  def get_title
    title #メソッドを呼び出してる
  end
end
-----
    video = MyVideo.new
    video.title = "testtest"
    puts video.get_title #=>"testtest"
    video.set_title_aa
    puts video.title #=>"testtest"
    video.set_title_aaa
    puts video.title #=>"aaa"

method_missing様様ですね。

制御構造(ifやwhileなど)はスコープを作らない。

while や for がスコープを作らないのに対し、loop や each などのイテレータはスコープを作ります。

プログラミング言語 Ruby リファレンスマニュアル

これも今日知った…。

for i in 1..3
  var = true
end
p var
# => true

これはjavaとかやってる人間からしたら気持ち悪いよなぁ。
ちなみに p iとかやると"3"って出てくる。



最後に

puts puts

これなんて出力されるかわかります?

#改行
nil

と出力されるわけなんですが
右側のputsで空白の改行を出力して、その戻り値のnilを左のputsで出力してる。
という認識なんですが合ってますよね?(笑



ちなみに何でこんな話が出てきたかというと

p = "aiue"
p p

こんなコードを後輩が書いてたからです。
それにしても何でpという変数名を選んだんだろう(笑