From: Masatoshi SEKI Date: 2010-01-29T20:30:13+09:00 Subject: [ruby-dev:40239] Re: [Feature #2366] private constant 咳といいます。 On 2010/01/28, at 20:55, Yusuke ENDOH wrote: > >>>> 今の 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 さんどうでしょうか。 > すみません。教えて下さい。 非公開クラスというのは、rubyspecよ、テストコードを書かないで!という 宣言をするものですか? それとも、アプリケーションが使ったり動的に定義をかえてはいけません、 という宣言をするものですか? たとえば、ERB::Compilerでしたら、specを書いてほしいとは思わないけど アプリケーションで定義を書き換えて、ERBの挙動を変えるのは止めさせたい とまでは思いません。 もしERBの実装が変わってしまってその書き換えをするコードが動かなくなって しまうのは、仕様が変わった、と納得してもらっても良いような気がします。