Rubyの変数の種類について詳しく解説してみた

Ruby

はじめに

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
タイトルとURLをコピーしました