2011-07-18 (Mon) [長年日記]
_ RubyKaigi2011 3日目
最後のRubyKaigiの最終日。これまでずっと小ホールのテクニカルなセッションを中心に見てきたのだけど、parse.yの話を聞きたいところをぐっと堪えて、日本Rubyの会のセッションとAll About RubyKaigi Ecosystemを聞いた。やはりこの二つは聞かないと。
他のセッションの中では、柴田さんのセッションの「機能の追加は慎重に削除は大胆に」という話が印象に残った。咳さんの「カスタマイズは誘惑する」話の続きだけど、erubyに限らず色々前科があるだけに耳が痛い(今日はdisられないだろうと思ったんだけどなあ)。
まつもとさんの基調講演は、最後のRubyKaigiでもいつもどおりで安心した。soraメソッドが使われるとは思ってなかったけど。
クロージングではスタッフが壇上に上がって(自分も一応スタッフ用の名札をもらっていたけど空気を読んで遠慮した)会場総立ちの拍手喝采だったけど、やっぱりRubyKaigiの一番の主役はスタッフなんだなと思う。
いったんこれでRubyKaigiは終わり、ということだけど、どうせまたやるんでしょ? ねえ、みなさん
_ スコープ付き定数参照
石塚さんのDeepConnectの発表を聞いて、スコープ付き定数参照の意味を変えてはどうかと思った。
peer = dc.open_deepspace foo = peer::Foo.new
のようなコードを実現するためには、Rubyの仕様的にはpeerはModuleである必要がある(そうではない場合、TypeErrorが発生する)。しかし、それだけの理由ならpeerをModuleにするのはちょっと気持ち悪い。
そこで、x::Yをx.const_get(:Y)という意味をもつ構文糖にすれば、Moduleである必要はなくなると考えた。xがModuleの場合は特別扱いして最適化すればいい。
しかし、実はx::Yはconst_getとは異なる動作をする。 x::Yの場合はObjectの定数は参照できない(xがクラスの場合は警告が出るだけ)が、x.const_get(:Y)では参照できる。x::Yでは、Object以外のスーパークラス・インクルードしているモジュールの定数は参照できるので、x.const_get(:Y, false)の動作とも異なる。
改めて、Rubyの定数周りの挙動は複雑だと思った。