Rubyのスコープ(Scope)とは?変数の見える範囲を理解しよう
プログラムにおいて「スコープ(Scope)」とは、変数や定義が有効な範囲のことです。
Rubyでは、変数の種類によってアクセスできる範囲が決まっており、これを理解することでバグを防ぎ、読みやすいコードが書けるようになります。
スコープの基本:変数の種類
種類 | 書き方 | スコープ |
ローカル変数 | name | メソッド・ブロック内など限定 |
インスタンス変数 | @name | インスタンス(オブジェクト)単位 |
クラス変数 | @@name | クラス全体で共有 |
グローバル変数 | $name | プログラム全体で有効 |
定数 | NAME | 定義したクラス・モジュール内 |
ローカル変数のスコープ
def greet
name = "さくら"
puts "こんにちは、#{name}"
end
# puts name # → エラー:ローカル変数は外から参照不可
ローカル変数は定義されたブロック・メソッド内のみ有効で、外からアクセスできません。
インスタンス変数のスコープ(@変数)
class Person
def set_name(name)
@name = name
end
def show_name
puts @name
end
end
p = Person.new
p.set_name("たろう")
p.show_name # → たろう
@name
のようなインスタンス変数は、同じインスタンス内で共有されます。
クラス変数のスコープ(@@変数)
class Counter
@@count = 0
def initialize
@@count += 1
end
def self.total
puts @@count
end
end
Counter.new
Counter.new
Counter.total # → 2
@@変数
は、クラス全体(全インスタンス)で共有されます。
グローバル変数のスコープ($変数)
$name = "世界"
def greet
puts "こんにちは、#{$name}"
end
greet # → こんにちは、世界
$変数
はどこからでも参照・変更できるため便利ですが、予期せぬ副作用を生みやすいため使用は最小限にしましょう。
定数のスコープ
class App
TITLE = "MyApp"
def self.show_title
puts TITLE
end
end
App.show_title # → MyApp
定数はクラス・モジュール・グローバルなスコープに定義でき、慣習としてすべて大文字で書きます。
ブロックスコープの注意点
x = 10
3.times do |i|
x = i # ここでもxを再代入できる
end
puts x # → 2(最後の値)
Rubyのブロック内では、外側のローカル変数がそのまま使えるため、予期せぬ値の変更に注意が必要です。
まとめ
Rubyのスコープ(Scope)は、変数や定数の有効範囲を管理する重要な概念です。
正しく理解することで、バグを防ぎ、読みやすく保守しやすいコードが書けるようになります。
ローカル変数を基本に、状況に応じてインスタンス変数や定数などを使い分ける習慣をつけましょう!