Rubyのプライベートメソッドと保護されたメソッド:メソッドの可視性を理解する
Rubyのプライベートメソッドとは何ですか?
これは、定義されたクラス内からのみ呼び出すことができるタイプのメソッドです。
これにより、メソッドへのアクセスを制御できます。
Rubyメソッドは :
- プライベート
- public(デフォルト)
- 保護
デフォルトでは、すべてのメソッドはpublic
。
どなたでもご利用いただけます!
ただし、メソッドをprivate
にすることで、これを変更できます。 またはprotected
。
なぜこれが役立つのですか?
これらのメソッドを簡単に変更できるからです。
作業中のいくつかの異なるプロジェクトで使用されるコードライブラリを作成していると想像してください。
これらのプロジェクトがライブラリを実装すると、作成したクラスのメソッドが呼び出されます。
今 :
新しいバージョンをリリースします…
しかし、public
で名前を変更することにしました メソッド。
これにより、この方法を使用しているすべてのプロジェクトでエラーが発生します!
これを覚えておいてください :
パブリックメソッドを少なくすることで、クラス内の変更の自由度が高まります。
いくつかのコード例を見てみましょう!
Rubyのプライベートメソッドを理解する
「プライベートメソッドが呼び出されました」というエラーメッセージを見たことがありますか?
これ :
self.puts 123 # NoMethodError: private method `puts' called
次に、private
を使用しようとしました メソッドが正しくありません。
プライベートメソッドは単独でのみ使用できます。
例 :
puts 123
同じ方法ですが、このように呼び出す必要があります。
プライベートメソッドは常にself
のコンテキスト内で呼び出されます 。
言い換えれば…
プライベートメソッドはでのみ使用できます :
- 同じクラスの他のメソッド
- 親クラスから継承されたメソッド
- モジュールに含まれるメソッド
つまり、プライベートメソッドを定義するクラスの外部からプライベートメソッドを呼び出すことはできません。
それには「明示的な受信者」が必要になるからです。
そうでない限り…
send
のような方法を使用します このルールをバイパスします。
send(:puts, "apple")
private
をどのように定義しますか 方法は?
このように :
def bacon "private bacon" end private :bacon
private
という単語 それ自体はキーワードではなく、Kernel
で定義されたメソッドです。 モジュール。
プライベートメソッドを配置する場所
クラスに複数のプライベートメソッドがあるのは通常のことです。
これらのメソッドはどこに配置しますか?
これを行う :
class Food def public_method end private def bacon end def orange end def coconut end end
すべてのインスタンスメソッド private
の後 プライベートメソッドになります。
private_class_method :method_name
を使用できます クラスメソッドをプライベートとして定義する場合
最初にすべてのパブリックメソッドを定義してから、private
を定義するのが一般的なパターンです。 クラスの最後に一緒にメソッド。
パブリックメソッド
パブリックは、Rubyのデフォルトのメソッド可視性です。
ここに例があります :
def orange "Vitamin C" end
オブジェクトfood
がある場合 orange
を定義します 、次のように呼び出すことができます:
food.orange
メソッドがプライベートまたは保護されている場合は、再度パブリックにすることができます。
このように :
public :orange
保護された方法とは何ですか?
保護された方法はあまり一般的ではありません。
それらはprivate
のようなものです メソッドですが、直接ではなく、オブジェクトに対して呼び出すことができます。
この例をプライベートで試す場合 エラーが発生します:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :name end food = Food.new("chocolate") puts food == food
name
が原因で、エラーが発生します プライベートになるため、other.name
を実行することはできません 。
しかし、protected
このコードは機能します!
プライベートメソッドと保護されたメソッド
それが違いです。protected
メソッドprivate
を保持します 、ただし、オブジェクトでそのメソッドを呼び出すこともできます。
プライベートでは、name
しか実行できません 、保護されている場合は、object.name
を実行できます 。
いつ保護を使用する必要がありますか?
equals(==
など)のような非常に特殊なケースがある場合のみ )メソッド。
Rubyのドキュメントでは、private
の使用を推奨しています protected
の代わりに 可能な限り。
そしてこのメモがあります :
「保護されたメソッドは、インラインキャッシュを使用できないため、低速です。」
私はこれに興味があったので、いくつかのベンチマークを実行しました :
public: 2813891.9 i/s private: 2699273.8 i/s protected: 2572122.0 i/s
これは、パフォーマンスの8.5%の違いです。
ビデオチュートリアル
概要
Rubyメソッドの可視性、パブリックメソッド、プライベートメソッド、保護されたメソッドについて学習しました。これらはRubyのキーワードではありません 、それらはModule
で定義されたメソッド自体です クラス。
より多くの人がこのトピックを理解できるように、この投稿を共有してください!
読んでくれてありがとう🙂
-
Rubyの関数とメソッド:独自の関数を定義する方法
Rubyメソッドとは何ですか? メソッドは、特定の目的のためにグループ化された1行または複数行のRubyコードです。 このグループ化されたコードには名前が付けられているため、コードを再度記述したり、コピーして貼り付けたりすることなく、いつでも使用できます。 メソッドの目的は次のとおりです : 情報を取得します。 オブジェクトを変更または作成します。 フィルターとフォーマットのデータ。 例1 : サイズ Arrayのメソッド オブジェクトは要素の数を示します(情報を取得します)。 例2 : pop メソッドは、配列から最後の要素を削除します(オブジェクトを変更します)。
-
Ruby Freezeメソッド–オブジェクトの可変性を理解する
オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー