Techioz Blog

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 ドキュメントを読んでください。