Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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で定義されたメソッド自体です クラス。

より多くの人がこのトピックを理解できるように、この投稿を共有してください!

読んでくれてありがとう🙂


  1. Rubyの関数とメソッド:独自の関数を定義する方法

    Rubyメソッドとは何ですか? メソッドは、特定の目的のためにグループ化された1行または複数行のRubyコードです。 このグループ化されたコードには名前が付けられているため、コードを再度記述したり、コピーして貼り付けたりすることなく、いつでも使用できます。 メソッドの目的は次のとおりです : 情報を取得します。 オブジェクトを変更または作成します。 フィルターとフォーマットのデータ。 例1 : サイズ Arrayのメソッド オブジェクトは要素の数を示します(情報を取得します)。 例2 : pop メソッドは、配列から最後の要素を削除します(オブジェクトを変更します)。

  2. Ruby Freezeメソッド–オブジェクトの可変性を理解する

    オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー