Rubyのさまざまな変数についてまとめました

Rubyのさまざまな変数についてまとめました

Rubyには以下のようにさまざまな変数が存在します。それぞれの記述方法、特徴をまとめました。

  • ローカル変数
  • インスタンス変数
  • クラスインスタンス変数
  • クラス変数
  • グローバル変数
  • 組み込み変数

ローカル変数

Rubyにおいて、@などのプレフィックスがつかない変数のことをローカル変数といいます。


user_name = "kona"
number = 123

puts user_name # "kona"
puts number # 123

ローカル変数は宣言と代入を同時に行う必要があります。


# 変数名だけだとエラー
user_name
# undefined local variable or method `user_name' for main:Object (NameError)

インスタンス変数

クラスの内部で、@がついた変数をインスタンス変数といいます。
同じインスタンス(オブジェクト)の中で共有されます。


class Book
  def initialize(name)
    @name = name
  end

  def description
    puts "This is #{@name}"
  end
end

book1 = Book.new("book1")
book1.description # This is book1

book2 = Book.new("book2")
book2.description # This is book2

インスタンス変数は宣言前でも呼び出すことが可能です。(ただしnilが返る)


class Book
  def description
    puts "This is #{@name}"
  end
end

book = Book.new
book.description # This is

インスタンス変数は、デフォルトではクラスの外部からアクセスすることはできません。


class Book
  def initialize(name)
    @name = name
  end

  def description
    puts "This is #{@name}"
  end
end

book1 = Book.new("book1")
puts book1.name # undefined method `name' for #<Book:0x000000010073aec8 @name="book1"> (NoMethodError)

以下のメソッドを使用することで外部からもアクセスが可能になります。

  • attr_reader
  • attr_writer
  • attr_accessor

attr_reader:読み込み可能に
attr_writer:書き込み可能に
attr_accessor:読み書き可能に


class Book
  attr_accessor :name # 追加

  def initialize(name)
    @name = name
  end

  def description
    puts "This is #{@name}"
  end
end

book1 = Book.new("book1")
puts book1.name # book1 ← エラーがなくなる

クラスインスタンス変数

クラスインスタンス変数は、クラス自信が保持している変数です。
クラス直下、またはクラスメソッドの中で@を付けて宣言された変数がクラスインスタンス変数になります。


class Book
  # クラスインスタンス変数
  @name = "book_class"

  def self.name
    # クラスインスタンス変数
    @name
  end

  attr_accessor :name

  def initialize(name)
    # インスタンス変数
    @name = name
  end

  def description
    # インスタンス変数 ↓の@name
    puts "This is #{@name}"
  end
end

class Comic < Book
  # クラスインスタンス変数
  @name = "comic_class"

  def self.name
    # クラスインスタンス変数
    @name
  end
end

book = Book.new("book")
puts book.name # book
puts Book.name # book_class

puts Comic.name # comic_class

クラス変数

クラスインスタンス変数は、スーパークラスとサブクラスで異なる変数として参照されていましたが、クラス変数はサブクラスでも同じ変数を参照できるようになります。
クラス変数は@@を付けて宣言します。


class Book
  @@name = "book_class"

  def initialize(name)
    @@name = name
  end

  def self.name
    @@name
  end

  def name
    @@name
  end
end

class Comic < Book
  @@name = "comic_class"

  def self.name
    @@name
  end

  def name
    @@name
  end
end

puts Book.name # comic_class → Comicクラスの定義時に上書きされる
puts Comic.name # comic_class

book = Book.new("book")
puts book.name # book

puts Comic.name # book → bookインスタンス作成時に上書きされる

グローバル変数

グローバル変数は、プログラムのどこからでも参照することができる変数です。
$をを付けて宣言します。


$name = "book_global"

class Book
  def initialize(name)
    $name = name
  end

  def name
    $name
  end
end

puts $name # book_global
book = Book.new("book1")
puts book.name # book1
puts $name # book1

組み込み変数

組み込み変数は、グローバル変数の中で、Rubyによってあらかじめ用途を定めている変数です。
例として、正規表現においてマッチした部分の値が代入される値として使用されています。


text = "住所は、123-4567です"
text =~ /(\d{3})-(\d{4})/

puts $& # 123-4567
puts $1 # 123
puts $2 # 4567

その他組み込み変数(特殊変数)は以下のページから確認できます。
https://docs.ruby-lang.org/ja/latest/class/Kernel.html

参考文献

変数と定数
https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html

プロを目指す人のためのRuby入門[改訂2版]
https://gihyo.jp/book/2021/978-4-297-12437-3

ruby