[解決済み] 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は読むだけでいいとして、書くことを許可するメソッドも書きますか?
関連
-
[解決済み】rubyの1e18という数字は何を意味するのか?
-
[解決済み] Rubyでランダムな文字列を生成する方法
-
[解決済み] rubyでディレクトリからすべてのファイルを要求する最良の方法?
-
[解決済み] Gem::Specification.reset中に未解決のスペックがある。
-
[解決済み] string literal in condition "とはどういう意味ですか?
-
[解決済み] マトリックスサムネーションチャレンジ
-
[解決済み] Ruby 2.0.0p0 IRB警告。"DLは非推奨です。Fiddleをお使いください。"
-
[解決済み] HTMLのid属性とname属性の違い
-
[解決済み】attr_accessorとattr_accessibleの違いについて
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】RVMをアンインストールする方法は?[重複] RVMのアンインストール方法
-
[解決済み】Ruby:kind_of? vs. instance_of? vs. is_a?
-
[解決済み] RubyのNameError
-
[解決済み] Ruby Detect方式
-
[解決済み] Rubyで日付文字列をパースする
-
[解決済み] Homebrew Portable Ruby のインストールに失敗しました (システムのバージョンが古すぎる場合もあります)
-
[解決済み] rubyでto_yamlに書式オプションを指定することはできますか?
-
[解決済み] Rubyの予期しないキーワードの終了、および予期しない入力の終了
-
[解決済み] JanusのセットアップにVIMプラグインを追加する
-
[解決済み] Rubyのattr_accessorとは何ですか?