From: Hidetoshi NAGAI Date: 2010-02-02T08:23:40+09:00 Subject: [ruby-dev:40292] Re: Array#flatten の仕様変更? 永井@知能.九工大です. From: Yukihiro Matsumoto Subject: [ruby-dev:40285] Re: Array#flatten の仕様変更? Date: Mon, 1 Feb 2010 17:03:05 +0900 Message-ID: > |1.9 の Array#flatten において,配列内のオブジェクトの > |to_ary メソッド呼び出しに対する挙動が原因でエラーとなる条件が > |NameError から NoMethodError に変更になったようですが, > |これは仕様変更でしょうか? > すみません、正直なところ「flattenにおいて、配列内のオブジェク > トの to_ary メソッド呼び出しに対する挙動が原因でエラーとなる > 条件」というのが、なにを意味するのかよくわからないのですが。 説明が悪くてすみません. > 1.8以前はto_aryを持っているかどうかをrespond_to?で判定してい > たのを、1.9では直接呼び出すようにしたことと関係していると思い > ますが。 次の例を 1.8 と 1.9 とで実行すると,結果が異なります. to_str でも同様のことが生じるので,ついでに含めています. -------------------------------------------------------------------------- obj1 = Object.new p [1,obj1].flatten #=> no error obj2 = Object.new def obj2.method_missing(id,*args) raise NoMethodError, "2 unknown '#{id}'" end begin p [2,obj2].flatten #=> error! rescue => e p e end obj3 = Object.new def obj3.method_missing(id,*args) raise NameError, "3 unknown '#{id}'" end begin p [3,obj3].flatten #=> [1.8] [3,obj3] ; [1.9] error! rescue => e p e end [obj1, obj2, obj3].each{|obj| begin case obj when /^xxx/ p ["xxx", obj] else p ["else", obj] end rescue => e p e end } -------------------------------------------------------------------------- --<< 1.8 >>------------------------- [1, #] [2, #] [3, #] ["else", #] ["else", #] ["else", #] ------------------------------------ --<< 1.9 >>------------------------- [1, #] [2, #] # ["else", #] ["else", #] # ------------------------------------ > |これが原因で Ruby/Tk が動かなくなっているのですが, > |問題の箇所を NameError から NoMethodError に変更すると > |仕様変更になるのでどうしようかと迷っています. > > NameErrorとNoMethodErrorは継承関係にあるので、あまり問題は起 > きないと思っていたのですが。具体的にどう動かなくなっているか、 > どのように変更しようと思っているか、など、聞かせていただける > とアドバイスしようがあると思います。 動かなくなっていたのは,flatten が呼ばれる配列の中に widget object が含まれている場合で,NameError で止まってました. # widget object では,知らないメソッドに対しては # 所有しない属性の参照/操作メソッドを呼ぼうとしていると解釈して, # 名前の響きで NameError を返すようにしていたのだと思います. 変更については,widget object の method_missing において to_ary と to_str の場合は NoMethodError となるように変更しました. 仕様変更にはなるのですが,この程度であれば, おっしゃる通り問題にはならないだろうと思いますので, ext/tk/lib/tk.rb の commit を済ませてしまいました. お騒がせしてすみませんでした. -- 永井 秀利 (nagai@ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門