Ruby の attr_accessor、attr_reader、attr_writer を使用する理由は何ですか? 質問する

Ruby の attr_accessor、attr_reader、attr_writer を使用する理由は何ですか? 質問する

Rubyには、次のようなキーを使ってインスタンス変数を共有する便利な方法があります。

attr_accessor :var
attr_reader :var
attr_writer :var

単に を使用できるのであれば、なぜattr_readerまたはを選択するのでしょうか? パフォーマンスのようなものがあるのでしょうか (疑わしいですが)? 理由があると思います。そうでなければ、そのようなキーは作成されなかったでしょう。attr_writerattr_accessor

ベストアンサー1

さまざまなアクセサを使用して、コードを読んでいる人に意図を伝え、パブリック API がどのように呼び出されても正しく動作するクラスを簡単に記述できるようになります。

class Person
  attr_accessor :age
  ...
end

ここでは、年齢の読み取りと書き込みの両方が可能であることがわかります。

class Person
  attr_reader :age
  ...
end

ここでは、年齢のみを読み取ることができることがわかります。年齢はこのクラスのコンストラクターによって設定され、その後は一定のままであると想像してください。年齢のミューテーター (ライター) があり、年齢は一度設定されると変更されないと想定してクラスが記述されている場合、そのミューテーターを呼び出すコードによってバグが発生する可能性があります。

しかし、舞台裏では何が起こっているのでしょうか?

次のように書くと:

attr_writer :age

それは次のように翻訳されます:

def age=(value)
  @age = value
end

次のように書くと:

attr_reader :age

それは次のように翻訳されます:

def age
  @age
end

次のように書くと:

attr_accessor :age

それは次のように翻訳されます:

def age=(value)
  @age = value
end

def age
  @age
end

それを踏まえた上で、別の考え方をしてみましょう。attr_... ヘルパーがなく、アクセサーを自分で記述する必要がある場合、クラスに必要な数以上のアクセサーを記述しますか? たとえば、age を読み取るだけでよい場合、それを書き込むためのメソッドも記述しますか?

おすすめ記事