変数の種類を知っておこう!Rubyで変数のスコープを使う方法【初心者向け】
初心者向けにRubyの変数の種類、スコープについて解説しています。実際に書きながら使い方を説明しているので、変数のスコープについてよく分からないという方でも理解できるはずです。Ruby学習中の方はぜひご覧ください。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Rubyで変数のスコープを使う方法について解説しています。
変数にもいくつか種類があるので、知っておくと今後役立つでしょう。
Rubyについてそもそもよく分からないという方は、Rubyとは何なのか解説した記事をまずご覧ください。
なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。
田島メンター!!変数のスコープというのは何ですか〜?
変数のスコープは、その変数を参照できる範囲のことを言うんだ。
スコープの外からは、参照することができないってことですか?
そうだね。ここではそれぞれの変数のスコープについて解説しよう。
目次
スコープとは
スコープは、変数の有効範囲の事です。スコープの外からは変数は見えないため、変数を参照できなくなっています。
そのスコープに対応するために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オンラインブートキャンプを開催しています。