0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

attr_accesorという呪文

Last updated at Posted at 2025-03-18

技術ブログ初投稿になります。

attr_accesor

formオブジェクトパターンを使用するときに再会したこやつ。

attr_accesorについて、使っているうちに大体のイメージをつかめてきたかなと思ったので、知識の定着を含めて書いてみます。

初心者目線での理解ですのでそこをご留意ください。

attr_accessor って何だ?

『魔法の箱』を作ってくれる、呪文です。

なんだか『魔法の筒』と読みたくなりますが、"箱"です。

attr_accesorclassの中で唱えます。

これを唱えることで、

  • 空の箱を用意する 📦
  • その箱にラベル(名前)をつける 🏷️
  • 箱の中身を出し入れできる 🔄

こんなことができるようになります。

どうやって使うの?

こんな感じで使います。

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のえらいところ

  1. コードが短く書ける ⌨️
  2. 読みやすい 👀
  3. 変更しやすい 🔧

特に、formオブジェクトパターンを使う実装の時は大活躍でした。
フォームから送られてくる大量の属性の値を受け取る為、箱を用意しないといけなかったからです。

attr_accesorに受け取りたい属性の数だけラベルをつけてお願いすれば、一行で済んでしまいます。

まとめ

attr_accessor

「名前付きの箱を用意して、値を入れたり出したりできるようにする」便利な呪文

です。

これからもお世話になるであろう、汎用性の高い呪文でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?