Rubyのattr_accessorとは何ですか?
概要
Rubyのattr_accessorを理解するのに苦労しています。 誰かこれを説明してもらえますか?
解決策
クラス person があるとします。
class Person
end
person = Person.new
person.name # => no method error
明らかに、メソッド名を定義したことはありません。そうしよう。
class Person
def name
@name # simply returning an instance variable @name
end
end
person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error
ああ、名前は読めますが、だからといって名前を割り当てることができるわけではありません。これらは 2 つの異なる方法です。前者をリーダー、後者をライターと呼びます。まだライターを作成していないので作成しましょう。
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"
素晴らしい。これで、リーダー メソッドとライター メソッドを使用してインスタンス変数 @name の書き込みと読み取りができるようになりました。ただし、これは非常に頻繁に行われるため、毎回これらのメソッドを作成するのに時間を無駄にする必要はありません。もっと簡単にできるのです。
class Person
attr_reader :name
attr_writer :name
end
これでも繰り返しになる可能性があります。リーダーとライターの両方が必要な場合は、アクセサーを使用するだけです。
class Person
attr_accessor :name
end
person = Person.new
person.name = "Dennis"
person.name # => "Dennis"
同じように動作します!そして、推測してください: person オブジェクトのインスタンス変数 @name は、手動で実行したときと同じように設定されるため、他のメソッドでも使用できます。
class Person
attr_accessor :name
def greeting
"Hello #{@name}"
end
end
person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"
それでおしまい。 attr_reader、attr_writer、および attr_accessor メソッドが実際にどのようにメソッドを生成するかを理解するには、他の回答、書籍、Ruby ドキュメントを読んでください。