Rubyでクラスを定義する際、インスタンス変数(@name など)を外部から読み書きするために、わざわざメソッドを定義していませんか?
Javaなどの言語から入った方は「ゲッター」や「セッター」を手動で書くのが当たり前だと思っているかもしれませんが、Rubyにはそれらをたった1行で自動定義してくれる強力なメソッドが存在します。
それが attr_accessor(アトリビュート・アクセサ) です。
attr_reader とは何が違うの?」「クラス変数にも使えるの?」
といった疑問を持つ方のために、この記事では attr_accessor の基本的な使い方から、読み取り専用・書き込み専用の使い分け、さらには実務で役立つクラスレベルでの活用テクニックまで、現在のRuby開発のスタンダードに合わせて解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
attr_accessorを使う最大のメリット
Rubyでは、原則としてインスタンス変数(@で始まる変数)にクラスの外部から直接アクセスすることはできません。
外部から値を参照したり変更したりするためには、そのためのメソッド(アクセサメソッド)を用意する必要があります。
しかし、変数が増えるたびにメソッドを定義するのは非常に手間がかかり、コードも長くなってしまいます。
attr_accessor を使えば、この「メソッド定義の手間」をゼロにすることができます。
手動で定義した場合とattr_accessorを使った場合の比較
まずは、attr_accessor を使わずに書いたコードと、使ったコードを見比べてみましょう。
1. 手動でゲッターとセッターを定義した場合
class User
def initialize(name)
@name = name
end
# ゲッター(値を読み取るメソッド)
def name
@name
end
# セッター(値を書き込むメソッド)
def name=(new_name)
@name = new_name
end
end
user = User.new("Tanaka")
puts user.name # => Tanaka
user.name = "Suzuki"
puts user.name # => Suzuki
2. attr_accessorを使った場合
class User
# これだけでゲッターとセッターが自動定義される
attr_accessor :name
def initialize(name)
@name = name
end
end
user = User.new("Tanaka")
puts user.name # => Tanaka
user.name = "Suzuki"
puts user.name # => Suzuki
手動で定義した場合は8行ほど必要だったゲッターとセッターの記述が、attr_accessor :name というたった1行に置き換わりました。
:name というシンボルを渡すことで、Rubyが内部的に @name というインスタンス変数に対する読み書きメソッドを自動生成してくれています。
変数が多くなればなるほど、この機能の恩恵は大きくなります。
attr_accessor / reader / writer の違いと使い分け
Rubyには attr_accessor 以外にも、用途に合わせて attr_reader と attr_writer というメソッドが用意されています。
セキュリティや設計の観点から、これらを適切に使い分けることが重要です。
3つのアクセサメソッドの違い一覧
| メソッド名 | 生成されるメソッド | 役割 |
|---|---|---|
attr_accessor |
読み取り(name) + 書き込み(name=) |
読み書き両方を許可する |
attr_reader |
読み取り(name) のみ |
読み取り専用(Read Only)にする |
attr_writer |
書き込み(name=) のみ |
書き込み専用(Write Only)にする |
使い分けのサンプルコード
class Product
# 名前は読み書き自由
attr_accessor :name
# 価格は読み取り専用(初期化後は変更不可にしたい場合など)
attr_reader :price
# パスワードは書き込み専用(外部からは見えないようにしたい場合)
attr_writer :password
def initialize(name, price)
@name = name
@price = price
end
def check_password
# 内部では @password を参照できる
puts "パスワードは設定されています" if @password
end
end
item = Product.new("PC", 100000)
# attr_accessor
item.name = "Gaming PC" # OK
puts item.name # OK
# attr_reader
puts item.price # OK
# item.price = 500 # エラー! (NoMethodError)
# attr_writer
item.password = "secret" # OK
# puts item.password # エラー! (NoMethodError)
attr_reader で定義された :price に対して代入を行おうとすると、price= というメソッドが存在しないためエラーになります。
これにより、「勝手に価格を変更されたくない」といった設計意図をコードで表現できます。
基本的には、まずは attr_reader で定義し、必要になった場合のみ attr_accessor に変更するというのが、バグを防ぐための良い習慣です。
クラス変数やクラスレベルでの利用方法
「インスタンス変数(@name)ではなく、クラス変数(@@count)のアクセサは作れないの?」 という疑問を持つ方もいるかもしれません。
残念ながら、attr_accessor はインスタンス変数専用の機能であり、クラス変数に対しては直接使えません。
しかし、「クラスインスタンス変数」に対して使うことで、擬似的にクラスレベルのアクセサを作成することは可能です。
クラスレベルでattr_accessorを使うテクニック
class AppConfig
# class << self の中で定義することで、クラスメソッドとして機能する
class << self
attr_accessor :version, :env
end
end
# インスタンス化せずにアクセスできる
AppConfig.version = "1.0.0"
AppConfig.env = "production"
puts "Version: #{AppConfig.version}"
puts "Environment: #{AppConfig.env}"
実行結果
Version: 1.0.0
Environment: production
class << self; end という特異クラス定義のブロック内で attr_accessor を使用すると、それはクラスオブジェクト自身(AppConfig)のインスタンス変数(クラスインスタンス変数)に対するアクセサになります。
これにより、アプリケーション全体の設定値などを AppConfig.version のように静的に管理したい場合に役立ちます。
initializeメソッドとの関係と省略
attr_accessor を使うと、初期化メソッド initialize の書き方もシンプルにできる場合があります。
特にRuby 3.2以降では、キーワード引数と組み合わせた省略記法が便利です。
キーワード引数を使ったモダンな初期化
class User
attr_accessor :name, :age
# キーワード引数を受け取る
def initialize(name:, age:)
@name = name
@age = age
end
end
user = User.new(name: "Sato", age: 30)
puts user.age
Railsなどのフレームワークでは、initialize を明示的に書かずに、new した後に attr_accessor で定義されたプロパティに値をセットするパターンもよく見られます。
Rubyのスキルを活かして年収を上げる方法
以上、Rubyのattr_accessorとは何かについてや、使い方などについて解説してきました。
Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



