はじめに
Rubyには様々な種類の変数があります。
・ローカル変数
・インスタンス変数
・クラス変数
・グローバル変数
Rubyの各変数は、変数名の先頭に以下のような特殊文字を用いて宣言されます。
マーク | 変数の種類 |
[a-z] or _ | ローカル変数 |
@ | インスタンス変数 |
@@ | クラス変数 |
$ | グローバル変数 |
ローカル変数
ローカル変数の名前は、常に小文字(a-z)またはアンダースコア(_)で始まります。
ローカル変数は、その初期化されたブロック内でのみアクセス可能です。メソッドの外では使用できません。
ローカル変数を初期化する必要はありません。
#例
number = 0
_Number = 0
インスタンス変数
インスタンス変数名は、常に@記号で始まります。
インスタンス変数は、指定されたインスタンスまたはオブジェクトのメソッド間で利用可能です。
インスタンス変数を初期化する必要はなく、初期化されていないインスタンス変数には常にnil値が格納されます。
class Player
def initialize(number, name, birthplace)
@player_number = number
@player_name = name
@player_birthplace = birthplace
end
def display_details()
puts "背番号は#@player_number"
puts "選手名は#@player_name"
puts "出身地は#@player_birthplace"
end
end
# オブジェクト作成
player1 = Player.new("0", "荻野貴司", "奈良")
player2 = Player.new("2", "藤原恭大", "大阪")
# メソッド実行
player1.display_details()
player2.display_details()
#出力結果
背番号は0
選手名は荻野貴司
出身地は奈良
背番号は2
選手名は藤原恭大
出身地は大阪
クラス変数
クラス変数名は、常に@@記号で始まります。異なるオブジェクト間でも利用可能です。
クラス変数はクラスに属し、クラスの特性を表すものです。使用する前に初期化する必要があります。
クラス変数のもう一つの考え方として、ひとつのクラスの文脈の中でのグローバル変数として考えることです。クラス変数は、そのクラスのすべての子要素に共有されます。初期化されていないクラス変数はエラーになります。
class Player
@@no_of_players = 0
def initialize(number, name, birthplace)
@player_number = number
@player_name = name
@player_birthplace = birthplace
end
def display_details()
puts "背番号は#@player_number"
puts "選手名は#@player_name"
puts "出身地は#@player_birthplace"
end
def total_no_of_players()
@@no_of_players += 1
puts "選手数: #@@no_of_players"
end
end
# オブジェクト作成
player1 = Player.new("0", "荻野貴司", "奈良")
player2 = Player.new("2", "藤原恭大", "大阪")
# メソッド実行
player1.display_details()
player1.total_no_of_players()
player2.display_details()
player2.total_no_of_players()
#出力結果
背番号は0
選手名は荻野貴司
出身地は奈良
選手数: 1
背番号は2
選手名は藤原恭大
出身地は大阪
選手数: 2
グローバル変数
グローバル変数名は、常に$で始まります。
クラス変数はクラスをまたいで使用することはできません。もし、クラスを超えて利用できる変数を1つ持ちたい場合は、グローバル変数を定義する必要があります。
グローバル変数のスコープはグローバルなので、プログラムのどこからでもアクセスすることができます。
初期化されていないグローバル変数はデフォルトでnil値を持ち、その使用によりプログラムが不可解で複雑なものになる可能性があります。
$number = 3
class Class1
def print_global
puts "Class1におけるグローバル変数に入っているのは#$number"
end
end
class Class2
def print_global
puts "Class2におけるグローバル変数に入っているのは#$number"
end
end
obj1 = Class1.new
obj1.print_global
obj2 = Class2.new
obj2.print_global
#出力結果
Class1におけるグローバル変数に入っているのは3
Class2におけるグローバル変数に入っているのは3