【Ruby入門】変数の扱い方まとめ|クラス・インスタンス・グローバル

Rubyを学習している時に、変数の違いや種類などで悩んだことはありませんか?

どんな場面で使う変数なのか?
自分で書いたコードに合っている変数なのか?

迷ってしまうこともありますよね。

そこで、ここではRubyで使われている代表的な変数の特徴や違いなどをまとめました。よく使われる変数の中にはスコープが分かりづらかったり、紛らわしいものもあるので、学習中の方にもわかりやすく説明していきます!

変数とは

変数とは、プログラムで使用する値を予め格納しておいたり、演算結果で得られた値を格納する用途で使われる箱のようなものです。

Rubyにおける代表的な変数は以下の通りです。

  • ローカル変数
  • 定数
  • グローバル変数
  • ブロック変数
  • インスタンス変数
  • クラス変数
  • クラスインスタンス変数


 

スコープという言葉が度々でてきますが、スコープとはその変数が使用可能な範囲のことです。そのため、変数の種類によってスコープ(参照できる範囲)が異なるので注意が必要です。

次項よりそれぞれの変数についての使い方やスコープについて説明していきます

ローカル変数

ローカル変数は変数の中で一番よく使われます。基本となる変数なのでしっかり理解しておくようにしましょう!

宣言

変数名には英数字と_(アンダーバー)を使うことができます。ただし、先頭に数字を使うことはできません。また、宣言と初期化を同時に行う必要があります。

慣習として、全て小文字を使います。

スコープ

メソッド、クラスなどの定義された場所の範囲内でのみ使用可能です。クラスやメソッドを超えての参照はできないので定義された場所以外から参照をするとエラーになります。

[実行結果]

定数

宣言

ルールはローカル変数と一緒ですが、アルファベット大文字を用います。慣習として、定数は全て大文字で宣言をします。

最初の文字だけ大文字にする「キャメルケース」はクラス名などに用います。

一般的なプログラミング言語では、定数は変更不可の値ですが、Rubyの定数は警告を出すだけで値の変更は可能です。

[実行結果]

変更不可の値にしたい場合は、オブジェクトに限りfreezeメソッドを使うことで可能になります。

スコープ

定義されたクラスやモジュール内やクラスを継承しているクラスなどで参照できます。

[実行結果]

クラスの中で定義可能なので同じ定数名でもクラスごとに違う値を持つことができます。定数はメソッドの中では定義できません。

グローバル変数

宣言

変数名の一番初めに「$」をつけることでグローバル変数は宣言できます。

スコープ

ローカル変数の逆で、メソッドやクラスを超えて参照できる変数です。定義した場所にとらわれず、プログラムのどこからでも参照や変更ができます。そのため、名前を付ける際には重複しないように注意が必要です。

[実行結果]

ブロック変数

宣言

ブロック内「{}(ブレース)またはdo ~ end内」で「|」で囲むことで宣言できます。
言葉で説明すると少しわかりにくいかもしれませんが、下の例の「iとx」のことを指します。

スコープ

ブロック実行の際にブロック内で使われる一時的な変数です。繰り返しなどの処理をする際、この「ブロック変数」に値を代入しながら処理をします。ブロック内からのみ参照可能な変数なのでブロック専用の変数と言えます。

[実行結果]

インスタンス変数

宣言

変数の初めに「@」をつけることで宣言を行うことができます。

スコープ

インスタンスメソッド内でのみ使用できる変数です。インスタンスごとに異なる値を持つことができ、メソッドを超えて参照することができます。

[実行結果]

クラス変数

宣言

変数目の初めに「@@」をつけることで宣言できます。

スコープ

定義されたクラス内で共有する値を扱うことのできる変数です。他のインスタンスで使用しても同じクラス内であれば共通の値として扱われるのでクラス内では一つの値しか扱うことができません。クラスを継承したクラスからも参照可能です。

[実行結果]

[実行結果]

このようにSamuraiクラスを継承したBushiクラスでもきちんとクラス変数にアクセスできています。

クラスの継承がどういうことなのかわからない方はこちらの記事を参考にしてみてください。

クラスインスタンス変数

宣言

インスタンス変数と同じく「@」ではじまりますが、定義される場所によりインスタンス変数と区別されます。

スコープ

クラス変数と同様にクラス内で定義し、定義されたクラス内でしか参照することができません。

インスタンス変数と同じく@を前置しますが、クラスで定義されている場合はクラスインスタンス変数、インスタンス内で定義されている場合はインスタンス変数と定義されている場所で区別します。

クラスを継承したクラスからは参照できないのがクラス変数との違いです。

[実行結果]

インスタンスメソッド内では、インスタンス変数として認識されるので、クラスインスタンス変数にはアクセスできません。

[実行結果] クラスメソッドの場合はクラスインスタンス変数にアクセスできます。
[実行結果] 継承したクラスからはクラスインスタンス変数にアクセスできません。

まとめ

いかがでしたか?この記事では、変数の扱い方について解説しました。

  • ローカル変数
  • 定数
  • グローバル変数
  • ブロック変数
  • インスタンス変数
  • クラス変数
  • クラスインスタンス変数

と変数の種類は多いので、それぞれの役割やスコープをしっかりと区別できるようにしておきましょう。また特に、インスタンス変数、クラス変数、クラスインスタンス変数の3つは混同しやすいのでもう一度復習しておいてください。

もし変数の扱い方について忘れてしまったらこの記事を確認してくださいね!

関連記事


【Ruby入門】Hash(ハッシュ)の基礎文法【コロン=シンボル】
更新日 : 2019年4月22日

理解しづらいRubyの正規表現とは?〜基礎の基礎を知ろう〜
更新日 : 2019年4月2日

【Rubyの正規表現!】基礎の基礎から応用まで徹底解説!
更新日 : 2019年6月12日

【Ruby入門】ifやif elseの基本からANDやORを使う応用まで完全解説!!
更新日 : 2019年5月14日

Rubyの文字列で使えるメソッド・使い方総まとめ
更新日 : 2019年4月2日

Rubyカリキュラム無料公開中!

この記事はRuby入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Ruby学習に必要な情報を一つにまとめていますので効率よくRubyを学ぶことが出来ます。この機会に是非活用していただければと思います。

【Ruby入門ガイド】アプリ開発で知っておくべき知識を総ざらい
更新日 : 2018年11月23日

Rubyを最短で習得したい方へ

近年では様々なWEBサービスが流通するようになりました。

WEBサービスの普及が進むにつれて、それらを素早く開発するのに長けたRubyの人気は今後さらに増し、Rubyエンジニアの需要も自ずと増えることは間違いなしでしょう。

元々ITリテラシーの高い方や他言語を習得している方であれば、独学でRubyを習得することが可能です。

ただし、プログラミング学習をしている方の多くは

「自分に合った教材が見つけられずに挫折してしまった」
「勉強のための勉強になってしまい、ゴールが見えない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決するのに何日もかかってしまう」

このような悩みを抱えたまま挫折してしまうのが現実となっています。

  • もう挫折したくない
  • 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
  • 自分だけのカリキュラムで効率的に勉強したい
  • WEBアプリケーション開発までしっかりサポートして欲しい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、初心者の方がつまづきがちな、「CookPad」、「Wantedly」、「食べログ」のようなWEBアプリケーション開発方法もスムーズに学習することできます。

実際にオリジナルWEBアプリを開発し、成果物として認められて仕事獲得に成功した塾生は数多くいます。

このように、オリジナルアプリ開発から仕事獲得まで徹底的にサポートすることでプログラミング初心者の方でも安心して基礎学習に取り組むことができます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

Rubyならではの学習方法や、現役フリーランスRubyエンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像から弊社サービス内容をご確認ください。

ruby_a2
LINEで送る
Pocket

書いた人

灰猫

灰猫

プログラミングの学習を始めたギーク女子。電子回路や様々なガジェット好き。プログラムの羅列を眺めているだけでも幸せなので勉強が進まないのが最近の悩み。好きなショートカットキーはCtrl+Z

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説