LoginSignup
3
1

More than 5 years have passed since last update.

変数のスコープ - Ruby

Posted at

変数

変数はスコープによって種類が分けられている。
命名規則があるため名前を見ただけで、なに変数なのかを判別できる。

ローカル変数

スコープ: ブロック、メソッド定義、クラス・モジュール定義、トップレベル
命名規則: 先頭が小文字のアルファベットがアンダースコアではじまる名前  例、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"
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1