1.8.7と1.9.1の挙動クイズ

今度のは難しいぞ!
継承は関係なかったので問題を修正.
(1)

class A
  def initialize
    eval "def f() 3 end"
  end
end

p A.new.f

(2)

class A
  private
  def initialize
    eval "def f() 3 end"
  end
end

p A.new.f


答え
(1)ruby1.8.7

3

(1)ruby1.9.1

3

(2)ruby1.8.7

3

(2)ruby1.9.1

-:8:in `<main>': private method `f' called for #<A:0x116408> (NoMethodError)

バグじゃね?
(多分)この挙動の違いの所為でnicovideoが動かない(Nicovideo::MyList#videosとかがprotected).そもそもなんでinitializeの中でregister_getterを呼んでるのかよくわからない.
(追記)それ以前にいろいろなライブラリが1.9に対応してない気がしてきた.無理臭い.
=>それほどでもなかった.
(2009-09-21-19:40追記)evalも関係なかった.普通のdefのネストでこの違いがある.仕様変更なのかなぁという気がしないでもないけど,一度も聞いたことはないな.