Rubyには、次のようなキーを使ってインスタンス変数を共有する便利な方法があります。
attr_accessor :var
attr_reader :var
attr_writer :var
単に を使用できるのであれば、なぜattr_reader
またはを選択するのでしょうか? パフォーマンスのようなものがあるのでしょうか (疑わしいですが)? 理由があると思います。そうでなければ、そのようなキーは作成されなかったでしょう。attr_writer
attr_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 を読み取るだけでよい場合、それを書き込むためのメソッドも記述しますか?