変数
変数はスコープによって種類が分けられている。
命名規則があるため名前を見ただけで、なに変数なのかを判別できる。
ローカル変数
スコープ: ブロック、メソッド定義、クラス・モジュール定義、トップレベル
命名規則: 先頭が小文字のアルファベットがアンダースコアではじまる名前 例、ruby
, _ruby
sample.rb
foo = 'foo in toplevel'
def display_foo
puts foo # NameErrorが発生
end
puts foo # "foo in toplevel"と表示
メソッドの外で定義されたローカル変数をメソッドの中から参照できない
sample.rb
greeting = "Hello, "
people = ['Alice', 'Bob']
people.each do |person| # person <= ブロックローカル変数と呼ぶ
puts grerting + person # "Hello, Alice"などと表示
end
puts person #NameError: undefined local variable or method`'person'...
ブロックの中からブロックのそとで定義されたローカル変数は参照できる
ブロックの外からプロックの中で定義されたローカル変数を参照しようとするとエラー
インスタンス変数
クラスから作成されたインスタンス毎にことなる値を格納される
スコープ: クラス内のメソッド(外部からのアクセスにはattr_accessor :インスタンス変数
を使用
命名規則: @から始まる名前 例、@ruby
sample.rb
class Ruler
def length=(var)
@length = var
end
def length
@length
end
end
ruler = Ruler.new
ruler.length = 30
ruler.length # => 30
クラス変数
クラスから作成された全てのオブジェクトで共有される
スコープ:クラスとそのインスタンス
命名規則:変数名の前に@@をつける 例、@@ruby
sample.rb
class Ruby
@@Ruby = "ルビー"
def hello
puts "こんにちは, #{@@Ruby}"
end
end
input = Ruby.new
input.hello #=>こんにちは, ルビー
グローバル変数
非常に広いスコープを持つ変数。どこからでも参照・変更できるがグローバル変数に依存したコードは読みづらくなる。
スコープ:どこからでも定義・参照・変更できる
命名規則:変数名の前に$をつける 例、 $ruby
sample.rb
$ruby = "Hello, Ruby"