Rubyのプライベートメソッドと保護されたメソッド:メソッドの可視性について

Rubyのプライベートメソッドとは何ですか?

これは、定義されているクラス内からのみ呼び出すことができるメソッドの一種です。

これにより、メソッドへのアクセスを制御できます。

Rubyメソッドは次のようになります:

  • private
  • public(デフォルト)
  • protected

デフォルトでは、すべてのメソッドはpublicです。

誰でも使える!

ただし、メソッドprivateまたはprotectedを作成することで、これを変更できます。

なぜこれが便利なのですか?

これらのメソッドを変更しやすくすることができるからです。

あなたが仕事でいくつかの異なるプロジェクトで使用されるコードライブラリを書いていると想像してください。

これらのプロジェクトがあなたのライブラリを実装するとき、彼らはあなたが作成したクラスのメソッドを呼び出すことになります。

今:

あなたは新しいバージョンをリリースしました…

しかし、あなたはpublicメソッドで名前を変更することにしました。

それは、このメソッドを使用しているすべてのプロジェクトでエラーを生成するために起こっています!

これを覚えておいてください:

公開メソッドを少なくすることで、クラス内での変更の自由度が高まります。

いくつかのコード例を見てみましょう!

Rubyでのプライベートメソッドの理解

“private method called”エラーメッセージを見たことがありますか?

:

self.puts 123# NoMethodError: private method `puts' called

次に、privateメソッドを誤って使用しようとしました。

プライベートメソッドは単独でのみ使用できます。

:

puts 123

これは同じ方法ですが、このように呼び出す必要があります。

プライベートメソッドは、常にselfのコンテキスト内で呼び出されます。

つまり…

あなたはプライベートメソッドを使用することができます:

  • 同じクラスの他のメソッド
  • 親クラスから継承されたメソッド
  • モジュールから含まれるメソッド

これは、それらを定義するクラスの外からプライ

それは”明示的な受信機”を必要とするからです。

Unless…

このルールをバイパスするには、sendのようなメソッドを使用します。

send(:puts, "apple")

privateメソッドをどのように定義しますか?

def bacon "private bacon"endprivate :bacon

privateという単語自体はキーワードではなく、Kernelモジュールで定義されたメソッドです。

プライベートメソッドを置く場所

クラスが複数のプライベートメソッドを持つのは普通です。

これらのメソッドはどこに配置しますか?

これを行う:

class Food def public_method end private def bacon end def orange end def coconut endend

private以降のすべてのインスタンスメソッドはプライベートメソッドになります。

クラスメソッドをprivateとして定義する場合は、private_class_method :method_nameを使用できます

最初にすべてのpublicメソッドを定義し、クラスの最後にprivateメソッドを一緒に定義

Publicメソッド

PublicはRubyのデフォルトのメソッド可視性です。

ここに例があります:

def orange "Vitamin C"end

orangeを定義するオブジェクトfoodがある場合は、次のように呼び出すことができます:

food.orange

メソッドがprivateまたはprotectedにされている場合は、再度publicにすることができます。

public :orange

保護されたメソッドとは何ですか?

保護されたメソッドはあまり一般的ではありません。

これらはprivateメソッドに似ていますが、直接呼び出すだけでなく、オブジェクト&で呼び出すことができます。

この例をprivateで試してみると、エラーが発生します:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

nameはプライベートになるため、other.nameを実行できないため、エラーが発生します。

しかし、protectedこのコードは動作します!

PrivateメソッドとProtectedメソッド

これが違いです。protectedはメソッドprivateを保持しますが、オブジェクトでそのメソッドを呼び出すこともできます。

privateではnameしかできず、protectedではobject.nameしかできません。

protectedを使用する必要があるのはいつですか?

equals(==)メソッドのような非常に特殊なケースがある場合のみ。

Rubyのドキュメントでは、可能な限りprotectedの代わりにprivateを使用することをお勧めします。

そして、このメモがあります:

“インラインキャッシュを使用できないため、保護されたメソッドは低速です。”

私はこれについて興味があったので、私はいくつかのベンチマークを実行しました:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

それはパフォーマンスの8.5%の違いです。

Video Tutorial

Summary

Rubyメソッドの可視性、パブリック、プライベート&保護されたメソッドについて学びました。 これらはRubyのキーワードではなく、Moduleクラスで定義されたメソッドです。



+