2

私はBeginning Rubyを読んでいて、プライベートメソッドと保護されたメソッドに関する部分で立ち往生しています。これは初心者の質問です。SO を少し検索しましたが、プライベート メソッドと保護されたメソッドの違いについて、明確で初心者向けの説明を見つけることができませんでした。

この本では 2 つの例を示しています。最初の例はプライベート メソッドの場合です。

class Person
  def initialize(name)
    set_name(name)
  end

  def name
    @first_name + ' ' + @last_name
  end

  private
  def set_name(name)
    first_name, last_name = name.split(/\s+/)
    set_first_name(first_name)
    set_last_name(last_name)
  end

  def set_first_name(name)
    @first_name = name
  end
  def set_last_name(name)
    @last_name = name
  end
end

この場合、試してみると

 p = Person.new("Fred Bloggs") 
 p.set_last_name("Smith")

set_last_name メソッドはプライベートであるため、使用できないことがわかります。そこまでは大丈夫です。

ただし、他の例では、年齢メソッドを保護されていると定義し、私がそうするとき

 fred = Person.new(34)
 chris = Person.new(25)
 puts chris.age_difference_with(fred)
 puts chris.age

エラーが発生します:

:20: protected method 'age' called for #<Person:0x1e5f28 @age=25> (NoMethodError)

正直なところ、プライベート メソッドと保護されたメソッドの違いがわかりません。同じように聞こえます。これについて二度と混乱しないように、誰かが明確な説明を提供してくれませんか?

必要に応じて、2 番目の例のコードを提供します。

4

1 に答える 1

3

保護されたメソッド (または属性) は、保護されたメソッド (または属性) を持つクラスを継承するクラスによってのみ使用できます。

a      d
 \      \
  b      e
   \
    c

クラス a に保護されたメソッドがある場合、これは b と c で使用できますが、d と e では使用できません。注: ruby​​ クラスで継承するためのアスキー アート ダイアグラム。

class A   
   public 
   def f obj
      obj.c
   end
   def g obj
      obj.b
   end
   def call_b
     b
   end

   private

   def b
      puts "Hi!_b"
   end


   protected
   def c
      puts "Hi!_c"
   end
end

a = A.new
b = A.new

a.f(b) # Hi!_c
a.g(b) # inj.rb:7:in `g': private method `b' called for #<A:0xb76df4cc> (NoMethodError)
a.call_b # Hi!_b  

この場合、メソッド f は、同じクラス (または継承されたもの) であるため、保護されたメソッドを「見る」ことができますが、プライベート メソッドは、これが呼び出された場合を除いて、すべてのケースの「b」メソッドをカプセル化 (非表示) します。彼のクラスの内部 (別のアクセス可能なメソッド (この場合、メソッド call_b) によって)。

于 2011-03-06T21:31:09.183 に答える