1. ホーム
  2. ruby

[解決済み] Rubyのattr_accessor, attr_reader, attr_writerを使う理由は?

2022-03-19 03:21:50

質問

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

attr_accessor :var
attr_reader :var
attr_writer :var

なぜ attr_reader または attr_writer を使うだけなら attr_accessor ? パフォーマンスみたいなものがあるのでしょうか(それは疑問ですが)。そうでなければ、このようなキーは作られないと思います。

解決方法は?

異なるアクセサを使用することで、コードを読む人に意図を伝え、パブリック API がどのように呼び出されたとしても正しく動作するクラスを書きやすくすることができます。

class Person
  attr_accessor :age
  ...
end

ここで、年齢を読むことも書くこともできることがわかります。

class Person
  attr_reader :age
  ...
end

ここで、年齢だけを読み取ることができることがわかります。 このクラスのコンストラクタで設定され、それ以降は一定であると想像してください。 もし、age のミューテーター(書き込み器)があって、一度設定された age が変化しないことを前提にクラスが書かれているとしたら、そのミューテーターを呼び出すコードからバグが発生する可能性があります。

しかし、その裏側では何が起きているのでしょうか。

と書けば。

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は読むだけでいいとして、書くことを許可するメソッドも書きますか?