ローカル変数とスコープ

変数とは

  • オブジェクトを入れておく箱のようなもの
  • 名前(変数名)がついた箱のなかにオブジェクトが入っている
#「name」という変数を定義しその中に「"コーヒー"」という文字列オブジェクトを代入
name="コーヒー"
#変数「name」を呼び出すと「コーヒー」が表示される
puts name
=>コーヒー

スコープとは

  • スコープは変数の見える範囲のことであり、変数の種類によって範囲が異なる。

ローカル変数

  • ローカル変数は定義したメソッドの中がスコープになる
    使用できるスコープが他の変数よりも限られている。
#testメソッド内で変数nameを同じメソッド内で使っている
  def test
  name = "satou"
p name 
end

test
=> satou

#testメソッド内で定義した変数nameはメソッドの外からは見えないので、メソッドの外からは使えない。
  def test 
  name = "satou"
end

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

インスタンス変数

  • ローカル変数より広いスコープを持ち、同じオブジェクトなら複数のメソッドをまたいで使用可能。
  • 変数名の頭に@をつけて定義。インスタンス毎に値を持てる。
class Menu
   def order(name)
   puts "#{name}をください"
   @name = name
end
   def order2
   puts"#{@name}をもう1枚ください"
   end
end

menu = Menu.new
menu.order("ピザ")
menu.order2
=> ピザをください
   ピザをもう1枚ください
#解説
ローカル変数nameのときは定義したメソッドの中がスコープなので、別のメソッドからは見ることができなかったが、インスタンス変数@nameはorderメソッドとorder2メソッドの両方から見ることができる

クラス変数

  • 変数名の頭に@@をつけて定義。クラス内で1つの値をもつ。
  • スコープはクラスとそのインスタンス
class Menu
   def initialize(name)
    @@name = name
   end

   def name
     @@name
   end
end

menu1 = Menu.new("ピザ")
menu2 = Menu.new("パスタ")

puts menu1.name
puts menu2.name
=>パスタ
  パスタ
#解説
menu2 = Menu.new("パスタ")で@@nameにパスタを代入したら、クラス変数はクラス内で1つの値しか持てないので、どのインスタンスで呼び出してもパスタが表示される