はじめに
- 筆者は先週の土曜日(2019/9/14)から、Rubyの学習を始めた修行中の身です。
間違っている箇所があれば、ご指摘くださいませ。
変数について
- 変数とは、オブジェクトの入れ物、またはオブジェクトを識別する名札のようなもの
- よく例えられる概念としては「箱」
- 箱に名前(変数名)をつけて、その中に中身(オブジェクト)を入れる
# サンプルコード
# 「word」という名前で変数を定義し、その中に"Hello World"という文字列を代入
word = "Hello World"
# 以下の通り、word変数を呼び出すと「Hello World」が表示された!
puts word
=> Hello World
スコープについて
- スコープは変数の有効範囲、範囲を超えるとその変数は使えなくなる
- スコープは変数の種類によって範囲が異なる
- 変数には、以下の種類がある(本当はもっとあるらいしいが省略
- ローカル変数
- インスタンス変数
- クラス変数
ローカル変数
- スコープは、定義されたメソッド内でのみ使用可能
- メソッドの壁を超えられない
# 有効範囲の検証
def test
name = "kazuki"
end
puts test
# =>kazuki
### 範囲外
def test1
return name
end
puts test1
# エラー発生、nameはtest関数の中でのみ有効
# => test.ruby:6:in `test1': undefined local variable or method `name' for main:Object (NameError)
インスタンス変数
- 頭に
@
をつけることで定義できる - スコープは、インスタンス内ならどこでも使用可能
- インスタンス毎に値を持てる
- 同じクラス内ならメソッドの壁を超えて参照可能
# 有効範囲の検証
class Test
def initialize(name)
@name = name #インスタンス変数を定義
end
def puts_name
puts @name
end
end
test1 = Test.new("kazuki")
test2 = Test.new("toshiro")
test1.puts_name
# =>kazui
test2.puts_name
# =>toshiro
クラス変数
- 頭に
@@
をつけることで定義できる - スコープは、クラス内ならどこでも使用可能
- インスタンス変数はインスタンス毎に値を持てるが、クラス変数はクラス内で1つの値を持つ
# 有効範囲の検証
class Test
def initialize(name)
@@name = name #クラス変数を定義
end
def puts_name
puts @@name
end
end
test1 = Test.new("kazuki")
test2 = Test.new("toshiro")
test1.puts_name
# =>toshiro
test2.puts_name
# =>toshiro
# 解説
# クラス変数はクラス内で1つの値を持つため、
# test2 = Test.new("toshiro")で@@nameにtoshiroを代入したあとは、
# どのインスタンスで呼び出してもtoshiroが表示される。