私はRubyを学んでいて、混乱するところまで来ました。
private
私が使用している本は、public
、およびについて述べてprotected methods
いますが、まだ少し混乱しています。それぞれの違いは何ですか?
私はRubyを学んでいて、混乱するところまで来ました。
private
私が使用している本は、public
、およびについて述べてprotected methods
いますが、まだ少し混乱しています。それぞれの違いは何ですか?
パブリック- どこからでも呼び出すことができます
Private - クラス スコープ外でメソッドを呼び出すことはできません。オブジェクトは自分自身にのみメッセージを送信できます
例: ベイカーはbake
public としてメソッドを持っていますbreak_eggs
が、private です
保護self
- デフォルトのオブジェクトが、呼び出しているメソッドを持つオブジェクトと同じクラスのインスタンスである限り、オブジェクトの保護されたメソッドを呼び出すことができます
例:n
保護されたメソッドを使用すると、とが両方とも同じクラスのインスタンスであるため、 の実行c1
を要求できます。c2
c2.n
c1
c2
そして最後になりましたが、重要なことです:
「クラス D < C」の場合、D は C のインスタンスと同じアクセス動作を示します。
参照: http://www.amazon.com/Ruby-Rails-Techniques-Developers/dp/1932394699
public
メソッドは誰にでも開かれています。private
vsについてprotected
は、「Ruby のプライベート メソッドと保護されたメソッド」を参照してください。
Rubyの「プライベート」メソッドと「保護」メソッドの違いは何ですか? Ruby では、「プライベート」メソッドと「保護された」メソッドの主な違いは、プライベート メソッドは明示的な受信側で呼び出すことができないのに対し、保護されたメソッドは. 「明示的な受信者」とは何ですか? 明示的な受信者は、メッセージを受信するオブジェクトです。次の例では、レシーバー ('parent') とメソッド ('get_name') があります。「親」オブジェクトは、「get_name」メソッドを実行する命令を受け取っています。
Private
説明しましょう。
メソッドは、他のほとんどのプログラミング言語protected
とは少し異なります。Ruby
というクラスとFoo
サブクラスがあるとしますSubFoo
。のような言語Java
でSubFoo
は、 Foo で定義されたプライベート メソッドにアクセスできません。ソリューションに見られるように、Ruby には、クラスのメソッドをそのサブクラスから隠す方法はありません。このように、Ruby
のプライベートは の のようJava
に機能しprotected
ます。
さらに、Foo クラスと の 2 つのインスタンスがあるa
としb
ます。のような言語ではJava
、a
とb
を相互に呼び出すことができますprivate methods
。では、そのRuby
ために a を使用する必要があります
protected method
。private
これが のとprotected
メソッドの主な違いRuby
です。
class Foo
private
def pri
'hey I am private of Foo'
end
protected
def prot
'Hey I am protected of Foo'
end
end
現在のサブクラスFoo
class SubFoo < Foo
def call_pri_of_foo
pri
end
def call_prot_of_foo
prot
end
end
内部でアクセサーを呼び出すようになりましたSubFoo
> sub_foo = SubFoo.new
=> #<SubFoo:0x00000002b56ad8>
> sub_foo.call_pri_of_foo
=> "hey I am private of Foo"
> sub_foo.call_prot_of_foo
=> "Hey I am protected of Foo"
ここまで; 違いはないようです
next_sub_foo = SubFoo.new
=> #<SubFoo:0x00000002b1a0b0>
def next_sub_foo.access_private(child_of_sub_foo)
child_of_sub_foo.pri
end
def next_sub_foo.access_protected(child_of_sub_foo)
child_of_sub_foo.prot
end
アクセサーを呼び出す
> next_sub_foo.access_private(sub_foo)
# => NoMethodError: private method `pri' called for #<SubFoo:0x00000002b56ad8>
ただし、兄弟の保護されたメソッドにアクセスできます
> next_sub_foo.access_protected(sub_foo)
# => "Hey I am protected of Foo"
より明確@tenderlove
な画像については、のブログもご覧ください。
詳細な例と説明については、「Ruby プログラミング/構文/クラス」を参照してください。
private
簡単に言えば、 、public
、およびメソッドの違いはprotected
、プログラム内でのそのメソッドの可視性です。たとえば、読み取り専用、読み取りと書き込み、ほぼ非表示です。
他の一部の言語とは異なり、Ruby のプライベート メソッドを完全に隠すことはできません。クラスの他のオブジェクト インスタンスではなく、オブジェクトのインスタンスのプライベート メソッドにのみアクセスできます。
もちろん、パブリックは完全なアクセシビリティであり、メソッドは通常、いくつかの例外を除いてデフォルトでパブリックに設定されています。
保護されたメソッドは、同じクラスのオブジェクトまたは子からでもアクセスできますが、これはプライベート メソッドには当てはまりません。
概念を理解するのに苦労している場合は、明示的なレシーバーを分解することが重要だと思います。
明示的な受信者は、メッセージを受け入れるオブジェクトです。
person.get_name
person はレシーバーであり、メソッド "get_name" はオブジェクト "person" にメソッド "get_name" を実行するよう指示しています。
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
puts "And #{phone_number}" # Private method called when initialized
end
private
def phone_number
return "XXX-XXX-XXXX"
end
end
p p1 = Person.new("mike", "jones")
p p1.phone_number # Not within the context of the object instance.
メソッドがプライベートの場合、そのメソッドが定義されているクラスのオブジェクト内の他のメソッドでのみ使用できます。