はじめに
Rubyを学んでいる中で、変数の種類と使える範囲(スコープ)についてなかなか理解するのが難しかったので、自分なりにまとめてみました。(現段階で学んだ範囲でまとめましたので使い方や言葉が限定的すぎるかもしれません。)
変数の種類について
今回は下記4種類の変数についてまとめました。
下に行くほど使える範囲(スコープ)が広いです。
- ローカル変数
- インスタンス変数
- クラス変数
- グローバル変数
全体像をつかむ
自分で理解したことをまとめて全体像として把握したのが下記の画像になります。
ここから1つずつ変数ごとに分けてまとめていきます。
ローカル変数
書き方:英字(小文字)または_から始める
使える範囲:定義されたメソッド内
全体像では、infoというインスタンスメソッドの中で定義されているので、このinfo内でしか使えません。
# インスタンスメソッド
def info
# ローカル変数
intro = "この猫ちゃんは"
"#{intro}#{@@area}に住んでいて、名前は#{@name}、毛色は#{@color}です。"
end
インスタンス変数
書き方:@から始める
使える範囲:インスタンスが生成されたクラス内のインスタンスメソッド
インスタンス変数は、initializeメソッドを使ってインスタンスが生成された際に自動で代入されるようにします。
def initialize(name:, color:)
# @インスタンス変数
@name = name
@color = color
end
インスタンス変数が使えるのはインスタンスが生成されたクラス内(ここならCat_tokyoクラス)のインスタンスメソッド内です。
# インスタンスメソッド
def info
# ローカル変数
intro = "この猫ちゃんは"
"#{intro}#{@@area}に住んでいて、名前は#{@name}、毛色は#{@color}です。"
end
また、インスタンス変数はインスタンスごとに情報を保持しています。
# インスタンス生成
tama = Cat_tokyo.new(name:"タマ", color:"白")
tora = Cat_tokyo.new(name:"トラ", color:"茶トラ")
ですので、呼び出したインスタンスに応じて変数の中身は変わります。
# インスタンスメソッド呼び出し
puts tama.info # => この猫ちゃんは東京に住んでいて、名前はタマ、毛色は白です。
puts tora.info # => この猫ちゃんは東京に住んでいて、名前はトラ、毛色は茶トラです。
クラス変数
書き方:@@から始める
使える範囲:定義されたクラス内
クラス変数はクラスで保持している情報です。
@@area = "東京"
クラス変数は、クラス内のインスタンスメソッドとクラスメソッド両方で使えます。
# インスタンスメソッド
def info
# ローカル変数
intro = "この猫ちゃんは"
"#{intro}#{@@area}に住んでいて、名前は#{@name}、毛色は#{@color}です。"
end
# クラスメソッド
def self.question
"#{@@area}に猫ちゃんが何匹住んでいるか知っていますか?"
end
グローバル変数
書き方:$からはじめる
使える範囲:プログラム全体
プログラムのどこからでも呼び出せる変数だが、全体に作用するためうっかり他の変数に干渉し予期せぬエラーを引き起こすこともあり得るので使用には注意が必要。
今回は書き方と使える範囲(スコープ)だけの確認とします。
まとめ
ひとつひとつの書き方はわかっても全体像を把握しないと理解するのは難しいのだなぁと感じました。
先にまとめた全体像からコードを引っ張ってきて説明を付けてみたのでわかりずらかったかな…という感じがしますが、また勉強を進めて理解が深まったら改めてまとめてみるかもしれません。