LoginSignup
0
0

More than 3 years have passed since last update.

rubyにおける変数の種類

Posted at

rubyにおける変数の種類

変数の種類が色々あってどう使い分けるかわからなかったので,自分用にメモを残す.

目次

  1. [ローカル変数]
  2. [インスタンス変数]
  3. [クラス変数]
  4. [グローバル変数]

ローカル変数

  • 小文字or_(アンダーバー)で始まる.
  • メソッドや,ブロック内のローカルなスコープで参照できる.
local.rb
def local()
  a = 3
end
p a

# =>Traceback (most recent call last):
local.rb:5:in `<main>': undefined local variable or method `a' for main:Object (NameError)

localメソッドで定義されたaは,メソッドの外からは呼び出せない.

インスタンス変数

  • @で始まる.
  • 同じクラス内であれば,違うメソッドからも参照可能.
  • インスタンスごとに値を保持できる.
instance.rb
class Instance
  def set_val(val)
    @val = val
  end

  def put_val
    p @val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.put_val


# =>
"aaa"
nil

インスタンスtest1の@valに,set_valメソッドを用いて,"aaa"を入れる.
その後,インスタンスtest2において,put_valを呼び出すが,nilが返ってくる.
ここから,各インスタンスごとに値を保持していることがわかる.

instance.rb
class Instance
  def set_val(val)
    @val = val
  end

  def put_val
    p @val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.set_val("bbb")
test2.put_val
# =>
"aaa"
"bbb"

インスタンスtest2に対してもset_valメソッドを用いる必要がある.

クラス変数

  • @@で始まる.
  • 同じクラスのすべてのインスタンスで共有される.
class.rb
class Instance
  def set_val(val)
    @@val = val
  end

  def put_val
    p @@val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.put_val
# =>
"aaa"
"aaa"

先ほどのインスタンス変数とは違い,値が同じクラスのすべてのインスタンスで共有されている.

class.rb
class Instance
  def set_val(val)
    @@val = val
  end

  def put_val
    p @@val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.set_val("bbb")
test2.put_val

test1.put_val

# => 
"aaa"
"bbb"
"bbb"

グローバル変数

  • $で始まる.
  • プログラムのどこからでも参照できる.
global.rb
class Global
  def set_val(val)
    $val = val
  end
end

test1 = Global.new
test1.set_val("aaa")

p $val

# => 
"aaa"
0
0
0

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
0
0