機械猫の日記 - rubyって、ここでもメソッド定義できるのね

昨日の夜妙な時間に電話がかかってきたので、なんとなくブログを眺めてしまう。
で、試してみる。

# 同じメソッドを定義する。
def hoge arg=(def hoge; "foo!"; end; hoge)
	arg
end

puts hoge # foo!
puts hoge(200)
 # foo.rb:6:in `hoge': wrong number of arguments (1 for 0) (ArgumentError)

ちょ、おまっ(汗
ええと、まてよ、もしかしてこれは・・・

puts hoge(200) # 200
puts hoge # foo!

おお。

puts hoge(100) # 100
puts hoge(200) # 200
puts hoge(300) # 300
puts hoge      # foo!
puts hoge(999)
 # foo.rb:9:in `hoge': wrong number of arguments (1 for 0) (ArgumentError)

これはつまり・・・初めて引数なしで呼ばれたときに再定義が評価されるってことだからですか。ふーん。
もしかしたら使えるんですか?(何に? 笑)

追記:・・・・
いや、考えてみたらやっぱよくわからん。どういう挙動なんすか?だれか教えて!

追記:わかったみたい
機械猫さんのコードの後半に一行追加

#再定義してみる
puts nil? #-> false

def hoge arg=(def nil?;"foo!";end;nil?)
  puts arg
end

puts nil? #-> false  <=コレコレ
hoge #-> foo!
puts nil? #-> foo!

定義の後でも呼び出し前ならやっぱりfalseなんだね。
そゆことかー。なんか頭がこんがらがってたよ。