[解決済み] なぜRubyにはprivateとprotectedの両方のメソッドがあるのですか?
疑問点
読む前に この記事 を読む前は、Rubyのアクセス制御はこんな感じだと思っていました。
-
public
- は任意のオブジェクトでアクセス可能です(例えばObj.new.public_method
) -
protected
- は、オブジェクト自身と、サブクラスの中からしかアクセスすることができません。 -
private
- protected と同じですが、メソッドはサブクラスには存在しません。
しかし、どうやら
protected
と
private
を呼び出すことができないという事実を除いては、同じように動作します。
private
メソッドを明示的なレシーバで呼び出すことができないという点を除けば、 同じように動作します(すなわち
self.protected_method
は動作しますが
self.private_method
は動作しません)。
これのどこがいいんだ?明示的なレシーバーでメソッドを呼び出したくないシナリオはいつあるのでしょうか?
どのように解決するのですか?
protected
メソッドは、定義されたクラスまたはそのサブクラスの任意のインスタンスによって呼び出されることができます。
private
メソッドは、呼び出したオブジェクトの内部からのみ呼び出すことができます。 他のインスタンスのプライベートメソッドに直接アクセスすることはできません。
ここで、簡単な実用例を紹介します。
def compare_to(x)
self.some_method <=> x.some_method
end
some_method
はありえない
private
でなければなりません。 必ず
protected
でなければなりません。なぜなら、明示的なレシーバをサポートする必要があるからです。 典型的な内部ヘルパーメソッドは、通常
private
にすることができます。
JavaやC++の動作方法とは異なることに注意する必要があります。
private
はRubyでは
protected
と似ていて、サブクラスがメソッドにアクセスすることができます。 Ruby では、メソッドへのアクセスをそのサブクラスから制限する方法はありません。
private
のようにサブクラスからのメソッドへのアクセスを制限する方法はありません。
Rubyにおける可視性は、quot;推奨されるものです。
send
:
irb(main):001:0> class A
irb(main):002:1> private
irb(main):003:1> def not_so_private_method
irb(main):004:2> puts "Hello World"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> foo = A.new
=> #<A:0x31688f>
irb(main):009:0> foo.send :not_so_private_method
Hello World
=> nil
関連
-
[解決済み] RubyのNameError
-
[解決済み] Ruby プログラムに一定時間待つように指示する
-
[解決済み] RubyのHashをキーでアルファベット順にソートする方法
-
[解決済み] Ruby - 文字列を日付に変換する
-
[解決済み] ルビー、すべての単語の最初の文字を大文字にする
-
[解決済み] 変数が整数であるかどうかのチェック
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] Rubyで「例外 => e」を救済するのはなぜ悪いスタイルなのですか?
-
[解決済み】Rubyのメソッドで感嘆符が使われるのはなぜ?
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】そのようなファイルやディレクトリはありません @ rb_sysopen ruby
-
[解決済み】Rubyで "gets "と "gets.chomp "を使用する方法
-
[解決済み] Gemfile が見つかりません。
-
[解決済み] ルビーです。そのようなファイルやディレクトリはありません @ rb_sysopen - testfile (Errno::ENOENT)
-
[解決済み] Rubyでリモートホストの到達可能性をpingで確認する方法
-
[解決済み] Ruby で Fixnum から String への暗黙の変換ができない (TypeError)
-
[解決済み] 配列に何かを追加しようとしたときに、nil から整数への暗黙の変換が行われない。
-
[解決済み] Rubyで中央値を計算する
-
[解決済み] gemのインストール中に "permission denied "エラーが発生するのはなぜですか?
-
[解決済み] Ruby Net::HTTPの実行期限が切れた