Rubyの変数や定数とは?
Ruby学習をしている中で、変数や定数の書き分けに混乱したのでまとめてみた。【ポイント】
・変数や定数は以下のように宣言と代入を同時に行う。
・変数名はスネークケースで書くことが一般的とされる。
・宣言された変数(定数)をスコープ内で呼び出して使用する。
# 数値
変数(定数)名 = 数値
変数(定数)名 = 数値 + 数値
# 文字列
変数(定数)名 = '文字列'
# 呼び出す
puts 変数名
puts "文字列#{変数名}文字列"
上記のように代入された変数を呼び出して使用する。
変数の種類と使い方
Rubyでは変数名の最初の一文字によって以下の変数/定数に区別される。・ローカル変数
・インスタンス変数
・クラス変数
・グローバル変数
・定数
*上記以外にも疑似変数などがあるが、今回は割愛。
各変数の主な違いは「変数名の最初の一文字」と「スコープ*」である。
*スコープ … 変数の有効範囲のこと。スコープ外では変数を参照できない。
ローカル変数
小文字もしくは'_'(アンダーバー)で始まる変数を「ローカル変数」と呼ぶ。 (*ASCII2の範囲外では変数名に漢字などを使える) 有効範囲(スコープ)は 宣言されたブロック、メソッド内、クラス/モジュール内のみ。一度有効範囲を抜けると消滅する。# 「name」という変数に"Taro"という文字列を代入して変数を宣言
name = "Taro"
# 変数nameの呼び出し
puts name
#=> Taro
# 式展開*
puts "私は#{name}です。"
#=> 私はTaroです。
*式展開: #{変数名}という形で、ダブルコーテーションに囲まれた文字列の中に記述することで変数に格納されている値が文字列の中で展開される。
インスタンス変数
@で始まる変数を「インスタンス変数」と呼ぶ。 インスタンス変数は特定のオブジェクト(クラス)に所属している。 有効範囲は基本的に所属しているオブジェクト内部のみだが、ゲッター/セッターメソッドを使うことで外部から読み書きすることができるようになる。class Menu #~~~~~インスタンス変数のスコープ~~~~~
# 外部から @food を呼び出せるようにする
attr_reader :food
# インスタンスを初期化するときに使う(ことが多い)initializeメソッド
def initialize(food)
# メソッド内でインスタンス変数を宣言/代入
@food = food
end
def order
puts "#{@food}食べたい"
end
end #~~~~~インスタンス変数のスコープ~~~~~
# インスタンスの作成
menu = Menu.new('そば')
# orderはクラス内で定義されているメソッドなのでゲッターがなくても呼び出せる
menu.order
#=> "そば食べたい"
# ゲッターメソッドを使ってスコープ外からインスタンス変数 "@food" を呼び出す
menu.food
#=> "そば"
クラス変数
@@で始まる変数を「クラス変数」と呼ぶ。 クラス内で定義する。 有効範囲は定義したクラス内のメソッドと継承したサブクラス、インスタンスである。 主にインスタンスに番号をつけたいときに使ってます。 *正直それ以外に思い浮かばなかった。。class Menu
# クラス内のメソッド外で宣言/代入
@@count = 0
def initialize(food)
@food = food
# 1つインスタンスが作成される毎に@@countには+1代入される
@@count += 1
end
def get_count
@@count
end
end
# インスタンス作成
menu1 = Menu.new('そば')
menu2 = Menu.new('うどん')
print("作成されたメニューの数:", menu1.get_count)
#=> "作成されたメニューの数: 2"
グローバル変数
$で始まる変数を「グローバル変数」と呼ぶ。 *$で始まる特殊変数(いわゆる組込変数)の場合もあるので注意有効範囲はプログラム全体。
どこからでも読み書きが可能 → 知らない間に変数が書き換わっている可能性があるため、扱いには注意が必要。
$food = "そば"
puts $food
定数
アルファベット大文字で始まる識別子 (例: Xxx, XXx XXX) ・メソッド内での定義ができない ・一度定義した定数に再び代入を行おうとすると警告メッセージが出る(更新はされる)# 軽減税率8%を定数に代入
REDUCED_TAX_RATE = 1.08
def calculation(price)
puts (price * REDUCED_TAX_RATE).floor
end
# 引数:1,000円の
calculation(1000)
#=> 1080