42

私はRubyを学んでいて、混乱するところまで来ました。

private私が使用している本は、public、およびについて述べてprotected methodsいますが、まだ少し混乱しています。それぞれの違いは何ですか?

4

7 に答える 7

45

パブリック- どこからでも呼び出すことができます

Private - クラス スコープ外でメソッドを呼び出すことはできません。オブジェクトは自分自身にのみメッセージを送信できます

例: ベイカーはbakepublic としてメソッドを持っていますbreak_eggsが、private です

保護self- デフォルトのオブジェクトが、呼び出しているメソッドを持つオブジェクトと同じクラスのインスタンスである限り、オブジェクトの保護されたメソッドを呼び出すことができます

例:n保護されたメソッドを使用すると、とが両方とも同じクラスのインスタンスであるため、 の実行c1を要求できます。c2c2.nc1c2

そして最後になりましたが、重要なことです:

  • 継承: サブクラスはスーパークラスのメソッド アクセス規則を継承します。

「クラス D < C」の場合、D は C のインスタンスと同じアクセス動作を示します。

参照: http://www.amazon.com/Ruby-Rails-Techniques-Developers/dp/1932394699

于 2014-02-05T11:51:27.567 に答える
33

publicメソッドは誰にでも開かれています。privatevsについてprotectedは、「Ruby のプライベート メソッドと保護されたメソッド」を参照してください。

Rubyの「プライベート」メソッドと「保護」メソッドの違いは何ですか? Ruby では、「プライベート」メソッドと「保護された」メソッドの主な違いは、プライベート メソッドは明示的な受信側で呼び出すことができないのに対し、保護されたメソッドは. 「明示的な受信者」とは何ですか? 明示的な受信者は、メッセージを受信するオブジェクトです。次の例では、レシーバー ('parent') とメソッド ('get_name') があります。「親」オブジェクトは、「get_name」メソッドを実行する命令を受け取っています。

于 2012-03-27T02:58:56.717 に答える
7

Private説明しましょう。 メソッドは、他のほとんどのプログラミング言語protectedとは少し異なります。RubyというクラスとFooサブクラスがあるとしますSubFoo。のような言語JavaSubFooは、 Foo で定義されたプライベート メソッドにアクセスできません。ソリューションに見られるように、Ruby には、クラスのメソッドをそのサブクラスから隠す方法はありません。このように、Rubyのプライベートは の のようJavaに機能しprotectedます。

さらに、Foo クラスと の 2 つのインスタンスがあるaとしbます。のような言語ではJavaabを相互に呼び出すことができますprivate methods。では、そのRubyために a を使用する必要があります protected methodprivateこれが のと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な画像については、のブログもご覧ください。

于 2016-03-30T14:05:59.140 に答える
6

詳細な例と説明については、「Ruby プログラミング/構文/クラス」を参照してください。

private簡単に言えば、 、public、およびメソッドの違いはprotected、プログラム内でのそのメソッドの可視性です。たとえば、読み取り専用、読み取りと書き込み、ほぼ非表示です。

他の一部の言語とは異なり、Ruby のプライベート メソッドを完全に隠すことはできません。クラスの他のオブジェクト インスタンスではなく、オブジェクトのインスタンスのプライベート メソッドにのみアクセスできます。

もちろん、パブリックは完全なアクセシビリティであり、メソッドは通常、いくつかの例外を除いてデフォルトでパブリックに設定されています。

保護されたメソッドは、同じクラスのオブジェクトまたは子からでもアクセスできますが、これはプライベート メソッドには当てはまりません。

于 2012-03-27T03:06:25.613 に答える
2

概念を理解するのに苦労している場合は、明示的なレシーバーを分解することが重要だと思います。

明示的な受信者は、メッセージを受け入れるオブジェクトです。

 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.

メソッドがプライベートの場合、そのメソッドが定義されているクラスのオブジェクト内の他のメソッドでのみ使用できます。

于 2016-09-17T21:26:50.673 に答える