ローカル変数とかスコープとかメソッドとか
ローカル変数と等号付きメソッド
レシーバを省略するとメソッドではなくローカル変数として扱われます。普通のメソッドは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という変数名を選んだんだろう(笑