変数とは
- オブジェクトを入れておく箱のようなもの
- 名前(変数名)がついた箱のなかにオブジェクトが入っている
#「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つの値しか持てないので、どのインスタンスで呼び出してもパスタが表示される