From: Yusuke ENDOH Date: 2010-01-28T20:55:19+09:00 Subject: [ruby-dev:40207] Re: [Feature #2366] private constant 遠藤です。 >>> 今の Ruby には、クラスが公開 API かどうかを伝える手段がドキュメント >>> しかありません。そのため、ERB::Compiler など、ライブラリの中の公開 >>> でない (と思われる) inner class を外から自由に参照できてしまいます。 >> なるほど、良いアイディアだと思います。採用するタイミングは >> Yuguiさんに訊いてみないといけませんが、いずれ採用したいと思い >> ます。Yuguiさんはどう思いますか? > しかし、ここまで書いてから気がつきましたが、もし rb_classext_t や > RCLASS_IV_TBL が公開 API だったら、このパッチはバイナリ互換性を > 壊すことになりそうです。関数レベルでの互換性は変わらない (はず) > ですが。 Yugui さんの返事はメールでは来ていませんが、IRC で - 1.9.2 では rb_classext_t の定義に /** internal */ と付ける (処置済み) - 1.9.3 以降でこの変更を入れる という判断をもらっています。 ですが、最近 rubyspec に目を通していて、この機能は早く入れた方がいいと 思いました。 rubyspec では「private method は基本的に spec に書かない (#initialize など一部例外はある)」という convension がありつつも、:nodoc: の付いた CGI::Html3 みたいなクラスの spec を書いていて、そのせいで 1.9 でエラー が大量に発生するようになっています。 これは、private constant さえあれば発生しなかった不幸だと思います。 従って、非公開クラスであることを明示する private constant を入れる事は わりと急務ではないかと思います。さらに、rubyspec をパスすることを標榜 している ruby 1.9.2 のリリースを早めることに繋がるんじゃないかなあとも 期待しています。 非互換については、無視できるレベルだと思います。 というわけで、Yugui さんどうでしょうか。 -- Yusuke Endoh