技術ブログ初投稿になります。
attr_accesor
formオブジェクトパターンを使用するときに再会したこやつ。
attr_accesor
について、使っているうちに大体のイメージをつかめてきたかなと思ったので、知識の定着を含めて書いてみます。
初心者目線での理解ですのでそこをご留意ください。
attr_accessor って何だ?
『魔法の箱』を作ってくれる、呪文です。
なんだか『魔法の筒』と読みたくなりますが、"箱"です。
attr_accesor
はclass
の中で唱えます。
これを唱えることで、
- 空の箱を用意する 📦
- その箱にラベル(名前)をつける 🏷️
- 箱の中身を出し入れできる 🔄
こんなことができるようになります。
どうやって使うの?
こんな感じで使います。
class Person
attr_accessor :name
end
# 使ってみよう
tanaka = Person.new
tanaka.name = "田中太郎" # 箱に値を入れる
puts tanaka.name # 箱から値を取り出す → 田中太郎
上の例では、Personクラスに対してname
というラベルのついた箱を用意しています。
そしてクラスの外でtanaka
というインスタンスを生成し、tanaka
に田中太郎
という名前をつけています。
class
の中で一度呪文を唱えれば、ラベルのついた箱ができ、
そのラベル付きの箱の中には自由にものを入れたり、取り出したりできるというわけです。
裏側で何が起きているのか
attr_accessor :name
と書くと、裏でこんなコードが自動的に作られています。
# 値を取り出すメソッド
def name
@name
end
# 値を入れるメソッド
def name=(value)
@name = value
end
つまり、「取り出す」と「入れる」の両方のメソッドを一度に作ってくれています。
attr_accesor
を使わない場合は、この二つのメソッドをクラスの中に書かないと、インスタンス変数に触ることができません。
attr_accesor、えらい。
お仲間の呪文もあるらしい
-
attr_reader
- 値を取り出すだけ(読み取り専用) -
attr_writer
- 値を入れるだけ(書き込み専用) -
attr_accessor
- 両方できる(読み書き可能)
例えば:
class Person
attr_reader :age # 年齢は見るだけ
attr_writer :password # パスワードは設定するだけ
end
使い方の一例
class User
attr_accessor :name, :email # 名前とメールは変更可能
attr_reader :joined_date # 登録日は変更不可
def initialize(name, email)
@name = name
@email = email
@joined_date = Time.now # 現在の時刻
end
end
# 使ってみよう
user = User.new("山田花子", "hanako@example.com")
puts user.name # 山田花子
user.name = "山田桜" # 名前を変更
puts user.name # 山田桜
puts user.joined_date # 登録日時が表示される
# user.joined_date = Time.now # エラー!変更できない
attr_accesorのえらいところ
- コードが短く書ける ⌨️
- 読みやすい 👀
- 変更しやすい 🔧
特に、formオブジェクトパターンを使う実装の時は大活躍でした。
フォームから送られてくる大量の属性の値を受け取る為、箱を用意しないといけなかったからです。
attr_accesor
に受け取りたい属性の数だけラベルをつけてお願いすれば、一行で済んでしまいます。
まとめ
attr_accessor
は
「名前付きの箱を用意して、値を入れたり出したりできるようにする」便利な呪文
です。
これからもお世話になるであろう、汎用性の高い呪文でした。