変数の種類を知っておこう!Rubyで変数のスコープを使う方法【初心者向け】

初心者向けにRubyの変数の種類、スコープについて解説しています。実際に書きながら使い方を説明しているので、変数のスコープについてよく分からないという方でも理解できるはずです。Ruby学習中の方はぜひご覧ください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Rubyで変数のスコープを使う方法について解説しています。

変数にもいくつか種類があるので、知っておくと今後役立つでしょう。

Rubyについてそもそもよく分からないという方は、Rubyとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。

 

大石ゆかり

田島メンター!!変数のスコープというのは何ですか〜?

田島悠介

変数のスコープは、その変数を参照できる範囲のことを言うんだ。

大石ゆかり

スコープの外からは、参照することができないってことですか?

田島悠介

そうだね。ここではそれぞれの変数のスコープについて解説しよう。

 

目次

 

スコープとは

スコープは、変数の有効範囲の事です。スコープの外からは変数は見えないため、変数を参照できなくなっています。

そのスコープに対応するためにRubyには様々な変数が用意されています。

 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

グローバル変数

グローバル変数はその名前の通りグローバルな変数です。スコープはプロジェクトの全ての範囲です。

そのため、プロジェクト内で一意であることが保証されている変数のみに使用されます。

思わぬ部分で変数名がかぶってしまいバグやエラーの原因ともなるので、使う場面はよく考えましょう。

$global = "global"

def greet
  p $global
end

greet => “global”

実行してみると、文字列が出力されていることがわかります。

 

田島悠介

グローバル変数は全体で使用することができるんだ。

大石ゆかり

一番分かりやすいですね。

田島悠介

次はインスタンス変数・クラス変数・ローカル変数を見ていくよ。これらはそれぞれスコープが異なるのでよく覚えておこう。

 

インスタンス変数

インスタンス変数はインスタンス毎に値を持つ変数です。

スコープはインスタンス内ならどこでも参照することができます。

class User
  def initialize(name)
    @name = name
  end

  def put_name
    p @name
  end
end

user1 = User.new("taroo")
user2 = User.new("hanako")
user1.put_name  => “taroo”
user2.put_name => “hanako”

実行してみるとインスタンス毎に違った値が出力されていることがわかります。

インスタンス変数はRubyやRubyを使用したフレームワークのRuby on Railsで頻出する変数です。必ず理解しておくようにしましょう。

 

クラス変数

クラス変数はクラス内で一意に値を持つ変数です。スコープはクラス内です。

下のプログラムはインスタンス変数をクラス変数に変更したサンプルです。

class User
  def initialize(name)
    @@name = name
  end

  def put_name
    p @@name
  end
end

user1 = User.new("taroo")
user2 = User.new("hanako")
user1.put_name => “hanako”
user2.put_name => ”hanako”

インスタンス変数と違いUserの名前がhanakoで上書きされていることがわかります。

クラス変数は思わぬ場面で上書きが起きたりすることもあるため、注意が必要です。

 

ローカル変数

ローカル変数は一番スコープが狭い変数です。

変数は定義されたメソッドのみです。

class User
  def initialize(name)
    local_name = name
  end

  def put_name
    p local_name
  end
end

user1 = User.new("taroo")
user2 = User.new("hanako")
user1.put_name
user2.put_name

上のプログラムを実行すると、

`put_name’: undefined local variable or method `local_name’ for #<User:0x007fcfbb1735a8> (NameError)

というエラーが発生します。

「local_name」というローカル変数かメソッドが用意されていませんという意味です。

スコープ外から変数を参照したためこのようなエラーが発生します。

 

擬似変数

擬似変数は今までの変数と趣が違うものとなっています。

擬似変数には「true」,「false」,「nil」の三種類があります。

p(1==1) => true
p(1==2) => false
p(nil) => nil
p(1==1) => true
p(1==2) => false
p(nil) => nil

trueは真、false、nilは偽を表します。

またnilは「何もない」状態を表します。falseとも0とも違う概念となっているため注意しましょう。

 

以上、Rubyにおける変数のスコープについて解説しました。

種類が多いので、実際に書きながら覚えていきましょう。

 

田島悠介

疑似変数はそれ自体に値を代入することができないものなので、ちょっと他とは違うね。ここでは参考程度に見ておくといいよ。

大石ゆかり

名前の前にインスタンス変数は@、クラス変数は@@が入るんですね。

田島悠介

そうだね。グローバル変数も$から始まるなどの決まりがあるので、表記を間違えないように気をつけよう。

大石ゆかり

分かりました。ありがとうございます!

 

[お知らせ]TechAcademyでは初心者でも最短4週間でオリジナルサービスが作れるRuby on Railsオンラインブートキャンプを開催しています。