class / initialize / attr_accessor
| 対応: | Ruby 1.8(2003) |
|---|
Rubyのクラス定義の基本構文です。クラスの定義・インスタンスの生成・初期化メソッド・アクセサメソッドの自動生成を解説します。
構文
# クラスの定義。
class クラス名 # 先頭は大文字(PascalCase)
# 初期化メソッド(new を呼ぶと自動的に実行される)。
def initialize(引数1, 引数2)
@インスタンス変数1 = 引数1
@インスタンス変数2 = 引数2
end
# インスタンスメソッドの定義。
def メソッド名
処理
end
end
# インスタンスの生成。
オブジェクト = クラス名.new(引数1, 引数2)
# アクセサメソッドの自動生成。
attr_reader :変数名 # 読み取り専用(ゲッターのみ)
attr_writer :変数名 # 書き込み専用(セッターのみ)
attr_accessor :変数名 # 読み書き両方(ゲッター + セッター)
メソッド一覧
| 構文 / メソッド | 概要 |
|---|---|
| class クラス名 | クラスを定義します。クラス名はPascalCase(先頭大文字)にします。 |
| def initialize | インスタンス生成時(new呼び出し時)に自動で実行される初期化メソッドです。 |
| @変数名 | インスタンス変数です。同じインスタンスのどのメソッドからでもアクセスできます。 |
| attr_reader | 指定したインスタンス変数の読み取り専用アクセサを自動生成します。 |
| attr_writer | 指定したインスタンス変数の書き込み専用アクセサを自動生成します。 |
| attr_accessor | 読み取りと書き込み両方のアクセサを自動生成します。 |
| クラス名.new | 新しいインスタンスを生成します。引数はそのまま『initialize』に渡されます。 |
サンプルコード
sample_class_initialize_attr_accessor.rb
# 基本的なクラス定義。
class Person
# attr_accessor でゲッターとセッターを自動生成します。
attr_accessor :name, :age, :favorite_song
# attr_reader で読み取り専用を生成します。
attr_reader :id
# クラス全体で共有するクラス変数。
@@count = 0
def initialize(name, age, favorite_song = nil)
@name = name
@age = age
@favorite_song = favorite_song
@@count += 1
@id = @@count # 生成順に ID を割り振ります。
end
def introduce
base = "#{@name}です。#{@age}歳です。"
@favorite_song ? "#{base}好きな曲は「#{@favorite_song}」です。" : base
end
def self.count
@@count
end
end
# インスタンスの生成。
kogami = Person.new("狡噛慎也", 28, "abnormalize")
akane = Person.new("常守朱", 20, "Enigmatic Feeling")
puts kogami.introduce # 狡噛慎也です。28歳です。好きな曲は「abnormalize」です。
puts akane.introduce # 常守朱です。20歳です。好きな曲は「Enigmatic Feeling」です。
# attr_accessor でゲッター・セッターを使います。
puts kogami.name # 狡噛慎也
kogami.name = "Kogami Shinya"
puts kogami.name # Kogami Shinya
# attr_reader の変数には代入できません。
puts kogami.id # 1
# kogami.id = 99 # NoMethodError になります。
# クラスメソッドで生成数を確認します。
puts Person.count # 2
ruby class_initialize_attr_accessor.rb 狡噛慎也です。28歳です。好きな曲は「abnormalize」です。 常守朱です。20歳です。好きな曲は「Enigmatic Feeling」です。 狡噛慎也 Kogami Shinya 1 2
概要
Rubyのクラスは非常にシンプルに定義できます。『attr_accessor』を使うと、手書きのゲッター・セッターメソッドを自動生成してくれます。複数の変数を一度に指定することもできます(例: 『attr_accessor :name, :age, :email』)。
インスタンス変数(『@変数』)はそのインスタンスだけに存在し、同じクラスの別インスタンスとは共有されません。一方、クラス変数(『@@変数』)はすべてのインスタンスで共有されます。
クラス変数(『@@変数』)は継承したサブクラスとも共有されます。意図しない共有による不具合が起きやすいため、クラスをまたいだ共有データには『クラスインスタンス変数(@変数をクラスメソッド内で使う)』を使う方が安全です。
アクセス制御(public/private/protected)については『public / private / protected』を、self・インスタンス変数・クラス変数の詳細は『self / @変数 / @@変数』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。