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