From: Makoto Kuwata Date: 2010-11-04T12:37:23+09:00 Subject: [ruby-list:47605] Rubyでも「private」イコール「非公開」? 桑田といいます。 [ruby-dev:39685] で、定数に public/private を指定できるようにすると いう話題があります。 > 今の Ruby には、クラスが公開 API かどうかを伝える手段がドキュメント > しかありません。そのため、ERB::Compiler など、ライブラリの中の公開 > でない (と思われる) inner class を外から自由に参照できてしまいます。 > > これを防ぐためには、匿名クラスを用いて定義すれば大分隠蔽できますが、 > 記述が相当煩雑になってしまいます。また、そのようにしてしまうと、 > 「非公開というのは承知の上で敢えて使いたい」という要求に答えにくく > なります。 > > そこで、定数に public/private の属性を指定できるようにするのはどう > でしょうか。 (詳細はこちらをご覧ください。 Feature #2366: private constant http://redmine.ruby-lang.org/issues/show/2366 ) ここで質問なのですが、Rubyでも「privateなもの=非公開」という 認識なのでしょうか。C++/Javaならこれが成り立つのはわかるのですが、 Rubyにおける private method は、「レシーバを指定した呼び出しが できないメソッド」のことであり、公開・非公開とは違う話だと 思ってました。 実際、ヘルパーメソッドなどはprivateだけど絶賛公開していることも ありますし、逆に公開したくないんだけどレシーバつけて呼び出すから privateはつけられないようなメソッドもあります。 上述のチケット (#2366) ではこの機能が導入されることが決定している ようですが、その場合、 ・定数 (クラス) に private をつけると、それは「非公開」を意味する ・メソッドに private をつけると、それは「レシーバが指定できない」を意味する というようになり、privateが複数の意味を持つことになって混乱しそうな 気がしました (ちょうどC言語での "static" のように)。 僕の場合だと、 ・レシーバなしで使う(関数のように使う)メソッドはprivateをつける ・非公開にするものは :nodoc: をつける (privateの有無は問わない) と使い分けていました。これは、Rubyではprivateであることと非公開で あることは違うという認識だったからです。 もしRubyでも「private=非公開」というのが一般的な認識であるなら、 自分のやり方を変えたほうがいい (たとえば private はやめて protected にするとか) と思い、質問してみました。 -- makoto kuwata