private constant 提案者の遠藤です。

以下はすべて私個人の理解です。と前置きして。


2010年11月4日12:37 Makoto Kuwata <kwa / kuwata-lab.com>:
> ここで質問なのですが、Rubyでも「privateなもの=非公開」という
> 認識なのでしょうか。C++/Javaならこれが成り立つのはわかるのですが、
> Rubyにおける private method は、「レシーバを指定した呼び出しが
> できないメソッド」のことであり、公開・非公開とは違う話だと
> 思ってました。

完全に違う話ではなく、目的と手段の関係にあると思っています。

  目的: 使ってほしくないことを伝えたい (普通には使えなくしたい)
  手段: レシーバを指定した呼び出しを禁止する

ただしこの手段は、異なる目的のためにも使われています。

  目的: 関数のように使ってほしいことを伝えたい
  手段: レシーバを指定した呼び出しを禁止する

どっちの意味なのかはユーザが空気を読む必要がありますが、大まかに
以下のコンセンサスがあると思っています。

  1. Kernel クラスに属す private メソッド
    => グローバル関数として公開 (p など)

  2. Module や Class クラスに属す private メソッド
    => 呼称は知らないが公開 (Module#attr_reader など)

  3. module_function として定義されているメソッド
    => モジュール関数として公開 (Math#sin など)

  4. それ以外
    => 非公開

ただし、「レシーバを指定した呼び出しを禁止する」のはあくまで手段
なので、ライブラリの作者がその手段を他の用途に使うのも、勝手だと
思います。


> 実際、ヘルパーメソッドなどはprivateだけど絶賛公開していることも
> ありますし、

ヘルパーメソッドが何かよくわからないので見当違いかもしれないですが、
例えば ERB::Util#h とかは module_function になっています。


> 逆に公開したくないんだけどレシーバつけて呼び出すから
> privateはつけられないようなメソッドもあります。

C++ の friend が欲しいケースですかね。これは別の問題だと思います。


> 上述のチケット (#2366) ではこの機能が導入されることが決定している
> ようですが、その場合、
> ・定数 (クラス) に private をつけると、それは「非公開」を意味する
> ・メソッドに private をつけると、それは「レシーバが指定できない」を意味する
> というようになり、privateが複数の意味を持つことになって混乱しそうな
> 気がしました (ちょうどC言語での "static" のように)。

・定数に private をつけると、それは「スコープが指定できない」ことになる
・メソッドに private をつけると、それは「レシーバが指定できない」ことになる

ですね。


> ・非公開にするものは :nodoc: をつける (privateの有無は問わない)

:nodoc: と付ける風習自体はよいことだと思いますが、private のように
プログラミング言語の機能として表明できればよりよいと思います。

-- 
Yusuke Endoh <mame / tsg.ne.jp>