[#47605] Rubyでも「private」イコール「非公開」? — Makoto Kuwata <kwa@...>
桑田といいます。
12 messages
2010/11/04
[#47606] Re: Rubyでも「private」イコール「非公開」?
— Yusuke ENDOH <mame@...>
2010/11/04
private constant 提案者の遠藤です。
[#47629] [ANN]第3回ぐんまRubyの勉強会(guRuby)のご案内 — Yuichi NANSAI <nansai@...>
南齋と申します。
2 messages
2010/11/14
[#47633] Mac OS X Snow Leopardのirbで日本語が入力できない — Tomohiko Hayashi <hayashi-t@...>
みなさま
7 messages
2010/11/17
[ruby-list:47610] Re: Rubyでも「private」イコール「非公開」?
From:
"Y. NOBUOKA" <nobuoka@...>
Date:
2010-11-06 06:32:17 UTC
List:
ruby-list #47610
信岡です。 私も遠藤さんと同じような理解をしていて、大別すると 1. クラスで定義されている private インスタンスメソッド、およびクラスとモジュールで定義されている private な特異メソッドは非公開にしたい 2. モジュールで定義されている private インスタンスメソッドはミックスインして関数として使って欲しい と分けられる思っています。 (組み込みクラスの private メソッドは別として。) ここで、関数として使って欲しいメソッド (2 番の用法) は module_function として定義すると考えると、private として明示的に宣言する場合は全て非公開扱いになるかなぁ、と。 ただし、「非公開」 の意味が桑田さんが考えているものと違っていて、桑田さんは > #いちおうここでは「非公開」=「使ってほしくない」という意味で考えてます。 と考えておられますが、私は 「非公開」 = 「外部オブジェクト (自分以外のオブジェクト) からは呼び出せない」 という意味で考えています。 (つまり、オブジェクトにとって非公開なのか、プログラマにとって非公開なのかの違い、でしょうか。) >> 目的: 使ってほしくないことを伝えたい (普通には使えなくしたい) >> 手段: レシーバを指定した呼び出しを禁止する > が妥当かどうか、というのがポイントなのかなと思います。 > #いちおうここでは「非公開」=「使ってほしくない」という意味で考えてます。 > つまり、レシーバつきの呼び出しを禁止することが、Rubyでは「非公開(使って > ほしくない)」を意味するかどうかです。 レシーバを指定した呼び出しを禁止する、ということは、そのメソッドを呼び出せるオブジェクトは自分自身だけである、ということになります。 例えばあるクラス C のインスタンス c1 があったとして、c1 の外部から c1 のプライベートメソッドは c1.method() の形式では呼び出すことができません。 これは 「(オブジェクトの外部から) 使って欲しくない」 という目的を達成する手段として妥当だと思います。 ただ、この方法だとクラス C のサブクラス CSub の中のメソッドからクラス C の private メソッドを呼び出したりすることはできるので、桑田さんが考えている 「非公開」 よりも緩い制限にはなっていると思います。 Ruby の private は、単にそのクラスをインスタンス化して使うようなプログラマに対しては非公開ですが、そのクラスのサブクラスを作って使うようなプログラマに対しては公開されている、(Java の protected に近い) と考えられると思います。 -- 信岡 裕也 (NOBUOKA Yuya)