LoginSignup
3
0

More than 3 years have passed since last update.

【Ruby】変数と定数のあれこれ

Last updated at Posted at 2021-03-05

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

まとめ

・各変数の違いは記述方法と有効範囲(スコープ)
・インスタンス変数をクラス外で呼び出したい場合はゲッターメソッドを使う
・変数/定数を効果的に使うことで柔軟かつスッキリした見た目にできるが、変数名選びがすごく重要。

参考

・Rubyリファレンスマニュアル
https://docs.ruby-lang.org/ja/latest/doc/index.html

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0