From: "Y. NOBUOKA" Date: 2010-11-06T19:00:45+09:00 Subject: [ruby-list:47614] Re: Rubyでも「private」イコール「非公開」? >> 1. クラスで定義されている private インスタンスメソッド、およびクラスとモジュールで定義されている private な特異メソッドは非公開にしたい >> 2. モジュールで定義されている private インスタンスメソッドはミックスインして関数として使って欲しい >> >> と分けられる思っています。 (組み込みクラスの private メソッドは別として。) > > この分類は・・・どうだろう。 > いちおう確認しますが、2. は非公開にはしないという意味ですよね。 > それだと、module内で非公開なメソッドを定義したい場合はどうするのでしょうか。 > Rubyのmoduleは実装が継承できることが特徴なので、moduleで定義されてても > 非公開にしたいケースは十分ありうると思います。 仰るとおりモジュールで定義される非公開にしたいインスタンスメソッドのことを考えていませんでした。 確かにモジュールで定義されている private インスタンスメソッドで、ミックスイン先のオブジェクトからも使って欲しくないようなものはありますね。 >> ただし、「非公開」 の意味が桑田さんが考えているものと違っていて、桑田さんは >>> #いちおうここでは「非公開」=「使ってほしくない」という意味で考えてます。 >> と考えておられますが、私は 「非公開」 = 「外部オブジェクト (自分以外 >> のオブジェクト) からは呼び出せない」 という意味で考えています。(つま >> り、オブジェクトにとって非公開なのか、プログラマにとって非公開なのか >> の違い、でしょうか。) > > 僕は、「外部オブジェクト (自分以外のオブジェクト) からは呼び出せない」ことは > 非公開とは関係ないと思ってます。 > 先のメールに例として書いたように、非公開なメソッドを外部オブジェクトから > 呼び出したいケースがあるので。 > > def _inspect2(buf, level) # 非公開にしたいメソッド > buf << (" " * level) << "- #{@value}\n" > @left_node._inspect2(buf, level+1) # でも外部オブジェクトから呼び出したい > @right_node._inspect2(buf, level+1) > # もちろん @left_node.__send__(:_inspect2, buf, level+1) とするのは可能 > end これはやはり非公開というものをどのように捉えるか、という問題だと思います。 桑田さんは 「ライブラリなどを使う他のプログラマに対して公開するかどうか」 という観点で非公開という言葉を使っておられると思いますが、Ruby の private は 「他のオブジェクトに対して公開するかどうか」 という観点で非公開を表すものです。 そして、「他のオブジェクトに対して公開しない」 ということは、すなわち 「同じクラスに属する他のオブジェクトからも呼び出すことができない」 ということです。 上で示された例は、同じクラスに属する他のオブジェクトから呼び出しを行いたいという例ですが、Ruby ではそういう場合は protected メソッドにします。 >>> 単に、Ruby における「private」という用語が「非公開」を意味するかどうかを >>> 確認したかっただけです。 ちょっとごちゃごちゃになってしまいましたので元々の上記話題に対してコメントしますと、Ruby の private は、他のオブジェクトからのアクセスを禁止するという意味で 「非公開」 であるが、サブクラスで定義されたメソッドからの呼び出しは可能であり、他の開発者から全く見えないという意味での 「非公開」 というわけではない、ということになります。 つまり、元々の 「Ruby では private であることと (他の開発者からは見えないという意味での) 非公開であることは違う」 という桑田さんの認識で間違いはないと思います。 他の開発者に見せたくないという意味で private を使うのは必ずしも正しくないですし、private だからといってドキュメントを出力する必要が必ずしもないわけではないはずです。 ちなみに、『プログラミング言語 Ruby』 (著: David Flanagan, まつもと ゆきひろ, 監訳: 卜部 昌平, 訳: 長尾 高弘) には 「private = 非公開」 ということが書いてありました (7.2 節)。 まあサブクラスから丸見えであるものを非公開と言っていいのかというのは議論の余地がありますが... -- 信岡 裕也 (NOBUOKA Yuya)