遠藤です。

>>> 今の 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 <mame / tsg.ne.jp>