Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

【Ruby】変数の種類と違い(グローバル変数・ローカル変数・インスタンス変数)

はじめに

今回はRubyの変数の種類と、それぞれの違いについて説明します。
どこでどの変数を使用すべきか把握できていないと、思わぬエラーの原因になったり、
あるいは保守性が下がってしまったりします:sweat_drops:
しっかり把握して使い分けが出来るようになりましょう。
変数自体が何かがわからない方はググってください。

変数の種類

グローバル変数

グローバル変数とは、簡単にいうと"そのプロジェクト内、どこでも使用できる変数"のことです!
どこで定義しても、どこからでも使用できる変数です。
一見とても便利ですが、どこでも使えてしまうからには一意である必要があります。
どこかで変数名が被ってしまうとエラーの原因になります。
使用する際は、本当にグローバルじゃなければダメなのかしっかり検討する必要があります!

定義の仕方は以下のように、変数の先頭に$マークをつけるだけです!

test.rb
$animal = "cat"

def animal_type
  puts "This animal is #{$animal}"
end

animal_type
# 出力結果==> This animal is cat

インスタンス変数

インスタンス変数は、次に紹介するローカル変数と合わせてよく使う変数のうちの1つです。
インスタンス変数は、インスタンスごとに値を持つことが出来、クラス内の全メソッド内で使用することが出来ます。
定義の仕方は以下のように、変数の先頭に@マークをつけるだけです!

test.rb
class User
  def set_name(str)
    @user = str #インスタンス変数@userをここで宣言!
  end

  def put_name
    puts @user #違うインスタンスメソッドで呼び出してみます
  end
end

user = User.new #インスタンスを作成
user.set_name("まいける") #インスタンスに対してそれぞれのメソッドを実行すると
user.put_name

# 出力結果==> まいける
#ちゃんと表示されました!

ローカル変数

ローカル変数は、その変数が宣言されたメソッド内やブロック内のみで使用できます。
使用範囲(スコープ)が一番狭い変数です!
定義する際は、変数の先頭に何もつける必要ありません!
以下は同一メソッド内でローカル変数を宣言し、使用している例です。

test.rb
class User
  def set_name(str)
    user = str #ローカル変数userをここで宣言!
    puts user #同じメソッド内で出力してみます
  end
end

user = User.new
user.set_name("まいける")

# 出力結果==> まいける
# 同じメソッド内であれば問題ないことがわかりました!

次に宣言したメソッドと別のメソッドでローカル変数を使用した場合どうなるか見てみます。

test.rb
class User
  def set_name(str)
    user = str
  end

  def put_name
    puts user
  end
end

user = User.new
user.set_name("まいける")
user.put_name

# 出力結果==> undefined local variable or method `user' for #<User:0x00007fda840d20f8> (NameError)
# put_nameメソッド呼び出し時のローカル変数userが宣言されていませんよ。というエラー

ローカル変数は宣言したメソッド内でしか使用できないので、当然エラーになりました。

まとめ

変数の種類                  特徴                   
グローバル変数 プロジェクト内どこからでも呼び出すことができる。
インスタンス変数 同一クラス内のメソッドであればどこでも使用できる。
ローカル変数 宣言したメソッド、ブロック内のみ使用できる。

さいごに

実は他にも変数は種類があるのですが、今回は基本的な上記3種類を紹介させて頂きました!
特にインスタンス変数とローカル変数はよく使用するので
ざっくりでも違いを理解されていた方が良いかと思います!

最後までご覧頂きありがとうございました:relaxed:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?