[#47605] Rubyでも「private」イコール「非公開」? — Makoto Kuwata <kwa@...>

桑田といいます。

12 messages 2010/11/04
[#47606] Re: Rubyでも「private」イコール「非公開」? — Yusuke ENDOH <mame@...> 2010/11/04

private constant 提案者の遠藤です。

[ruby-list:47605] Rubyでも「private」イコール「非公開」?

From: Makoto Kuwata <kwa@...>
Date: 2010-11-04 03:37:23 UTC
List: ruby-list #47605
桑田といいます。

[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

In This Thread

Prev Next