よくわかるのは今住んでる島根県と育った鳥取県なのだが、まあ、「くすっ」と笑えるくらいか。
しかし、宍道湖七珍の「すもうあしこし」ってなんだったっけ。
...だったかな。Googleするとトップはうちの会社の人だった。
よしおかさんによる。人財という話になっているようだ。まあ、そうかも。
コネクションは重要だ。が、そのコネクションを上手に活用するのはもっと重要だ。
私は幸い日本のオープンソース界ではたぶんトップレベルのコネクションを持っていると思うのだが、あんまり活用しきれてないなあ。
マレーシアで時間があったら、よしおかさんとそういう話もできるといいな。
1.9で定数探索のルールを変更した。1.8までの定数探索ルールは
だが、これはスーパークラスの定数とスーパークラスの定数がどちらが優先かよくわからない、とか、ネストの外側の定数参照はレキシカルな参照に見えるが実はそうじゃない、とか、あまり気に入らないと思っていたのだ。
新しいルールは以下の通り。
本当はもっと単純なルールにしたかったのだが、結局前と同じくらい複雑になっている。いろいろな局面でもっとも便利なルールを考えていたらこうなってしまった。
このルールの(2)でObjectを除いているのは、 Objectがグローバルな定数の置き場所になっているため。グローバル定数よりはよりスコープの狭いネストの外側の定数を優先したかったため。ネストの一番外側はObjectと決まっているので、このルールで見えるべき定数は全部見える。
探索順序が変わっただけで、探索範囲は減っていないから、定数の名称が重複しない限り問題は発生しない。
標準添付のライブラリの範囲内で問題が起きたのは以下の二ヶ所。
webrick/httpservlet/cgihandler.rb: class CGIHandler < AbstractServlet Ruby = File::join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name']) Ruby << ::Config::CONFIG['EXEEXT'] CGIRunner = "\"#{Ruby}\" \"#{Config::LIBDIR}/httpservlet/cgi_runner.rb\""
ここではトップレベルのConfigとWEBrick::Configが混在している。 5行目を以下のように書き換えた。
CGIRunner = "\"#{Ruby}\" \"#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb\""
よりわかりやすい方向に矯正されたと思う。
もうひとつはresolv.rb:
class A < Resource ClassHash[[TypeValue = 1, ClassValue = ClassValue]] = self
ここの「ClassValue = ClassValue」が問題の箇所。これはネストの外側の定数を自クラスにコピーしている、と読むらしい。
以下のように書き換えた
class A < Resource TypeValue = 1 ClassValue = IN::ClassValue ClassHash[[TypeValue, ClassValue]] = self # :nodoc:
こちらもより明確になったのではないだろうか。大差ないけど。
ついでに、load()のwrap modeにおいて正しい順序で定数探索するようにした。 1.8ではwrapを行うanonymous moduleの優先順位が高すぎる。 1.9でもメソッドの探索順位は直ってないわけだが...。
これは将来Classboxを導入した時にwrap modeをClassboxで実装すれば根本的に解決するように思う。Classboxっていろいろ使えるな、魔法のようだ。効率良く実装できれば世界が変わるかも。