From: Shugo Maeda Date: 2012-11-12T18:32:40+09:00 Subject: [ruby-dev:46496] Re: Refinement仕様 前田です。 2012年11月12日 17:50 Yukihiro Matsumoto : > module_evalを使ったトリックは、松田さんのRubyConf発表でもあ > り、なかなか興味深いテクニックなのですが、その一方、同じコー > ドがrefinement有効で呼び出されるのか確定できず、最適化が難し > い上に、インラインキャッシュと相性が悪いという問題があります。 > > ちなみに現状では(a),(b),(c)とも有効だが、(c)についてはインラ > インメソッドキャッシュに関連する深刻なバグがあり、r37616で修 > 正が試みられたが、深刻な速度低下問題によりrevertされた、と認 > 識しています。合ってる? はい。 > で、週末つらつらと考えたのですが、 > > * refinementはレキシカルななにかではなく、モジュール・クラ > スに追加される属性である > > という点をより明確にして、(a),(b)ともに有効にしようと思います。 了解しました。 > (c)については悩んだのですが、かなり深刻な問題だと思うので、 > > * module_eval(&b)の形式は禁止(例外) > * またはrefinement状態が異なる状態でのブロックの実行は禁止 > > のいずれかではどうだろうかと思っています。前者であれば松田テ > クニックが使えないことになるわけで、個人的には後者を望んでい > ますが、前者でも仕方がないと思っています。将来制約緩和の可能 > 性はあるので。 「refinement状態が異なる状態でのブロックの実行は禁止」というのは、 ブロックを作った時と異なる状態ということではなく、ブロックを一度でも 実行するとその時のrefinementの状態を覚えておいて、違う状態で実行した 時にエラーにするという理解で合っているでしょうか? インラインキャッシュの問題については、ささださんの案で解決されそう ですが、それでも「refinement状態が異なる状態でのブロックの実行は禁止」 した方がよいと思われますか? 仕様的にちょっと微妙な気がするのですが。 -- Shugo Maeda