Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. class / initialize / attr_accessor

class / initialize / attr_accessor

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』に渡されます。
サンプルコード
# 基本的なクラス定義。
class Person
  # attr_accessor でゲッターとセッターを自動生成します。
  attr_accessor :name, :age
  # attr_reader で読み取り専用を生成します。
  attr_reader :id

  # クラス全体で共有するクラス変数。
  @@count = 0

  def initialize(name, age)
    @name = name
    @age = age
    @@count += 1
    @id = @@count  # 生成順に ID を割り振ります。
  end

  def introduce
    "#{@name}です。#{@age}歳です。"
  end

  def self.count
    @@count
  end
end

# インスタンスの生成。
alice = Person.new("Alice", 30)
bob   = Person.new("Bob", 25)

puts alice.introduce  # Aliceです。30歳です。
puts bob.introduce    # Bobです。25歳です。

# attr_accessor でゲッター・セッターを使います。
puts alice.name  # Alice
alice.name = "Alicia"
puts alice.name  # Alicia

# attr_reader の変数には代入できません。
puts alice.id    # 1
# alice.id = 99  # NoMethodError になります。

# クラスメソッドで生成数を確認します。
puts Person.count  # 2
概要

Rubyのクラスは非常にシンプルに定義できます。『attr_accessor』を使うと、手書きのゲッター・セッターメソッドを自動生成してくれます。複数の変数を一度に指定することもできます(例: 『attr_accessor :name, :age, :email』)。

インスタンス変数(『@変数』)はそのインスタンスだけに存在し、同じクラスの別インスタンスとは共有されません。一方、クラス変数(『@@変数』)はすべてのインスタンスで共有されます。

クラス変数(『@@変数』)は継承したサブクラスとも共有されます。意図しない共有による不具合が起きやすいため、クラスをまたいだ共有データには『クラスインスタンス変数(@変数をクラスメソッド内で使う)』を使う方が安全です。

アクセス制御(public/private/protected)については『public / private / protected』を、self・インスタンス変数・クラス変数の詳細は『self / @変数 / @@変数』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。