0

質問を拡大する前に、ここここここの質問への回答を読んだことを述べさせてください。したがって、私の質問を重複としてマークしないように依頼しても、これらの回答ではattr_accessor. 私の質問は、構文ではなくロジックに関係しています。

以下の 2 セットのコードを作成しました。attr_accessor1 つのセットにラインがないことを除いて、セットは互いに同じです。両方のセットを実行すると、どちらも同じ出力が得られました。attr_accessorでは、論理的に言えば、両方のコード セットで同じ意図した出力が得られた場合、この行によってどのような違いが生じるのでしょうか?

コードセット 1:

class Animal 

   def initialize(name)
      @name = name
   end
end
class Cat < Animal
   def talk
     "Meaow!"
   end
end
class Dog < Animal
   def talk
     "Woof!"
   end
end

animals = [Cat.new("Flossie"), Dog.new("Clive"), Cat.new("Max")]
animals.each do |animal|
    puts animal.talk
end
#Output:
#Meaow!
#Woof!
#Meaow!

コードセット 2:

class Animal

attr_accessor :name  #this line is the only difference between the two code sets.

   def initialize(name)
      @name = name
   end
end
class Cat < Animal
   def talk
     "Meaow!"
   end
end
class Dog < Animal
   def talk
     "Woof!"
   end
end

animals = [Cat.new("Flossie"), Dog.new("Clive"), Cat.new("Max")]
animals.each do |animal|
    puts animal.talk
end
#Output:
#Meaow!
#Woof!
#Meaow!

どちらのコード セットも Animal クラスを呼び出して、名前付きの動物オブジェクトの新しいインスタンスを作成します。私は「...WITH Names」を強調しています。attr_accessor (2 番目のセット) が:name属性を定義しているためです。しかし、最初のコード セットでは、 を削除しましたattr_accessorが、name 属性を持つオブジェクト インスタンスを作成することができました。

4

2 に答える 2

0

インスタンス変数は、インスタンス メソッド内で常に読み書きできます。これは、コードで示されています。attr_accessorインスタンス変数をクラス外で読み取り/書き込み可能にします(アクセサ メソッドを定義することにより)。2 番目の例に追加すると、次のことが可能になります。

cat = Cat.new("Garfield")
puts cat.name
cat.name = "Maru"

NoMethodError最初の例で発生します。

于 2013-08-21T14:32:20.683 に答える