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

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

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

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

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

変数とは

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

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

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


 

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

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

ローカル変数

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

宣言

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

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

samurai = "ruby" # アルファベットの小文字
samurai_1 = "ruby" # 数字もOK

#数字で始めてはいけない
1_samurai = "ruby" #=> SyntaxError

#宣言のみはエラーとなる
samurai #=> NameError: undefined local variable or method `samurai' for main:Object

スコープ

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

class Cat
  name = "ねこ"
   def catName
   puts name
 end
end
cat = Cat.new
cat.catName

[実行結果]

undefined local variable or method `name' 

定数

宣言

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

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

SAMURAI = "ruby"

Samurai = "ruby" # クラス名と紛らわしいので定数としては使われない

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

SAMURAI = "ruby"
SAMURAI = "change value"
[実行結果]
(pry):2: warning: already initialized constant SAMURAI
(pry):1: warning: previous definition of SAMURAI was here
=> "change value"

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

スコープ

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

SAMURAI = 3.14
puts SAMRAUI        
[実行結果]
3.14

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

グローバル変数

宣言

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

$global = "ruby"

スコープ

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

$global = "global"

def greet
  p $global
end

greet
[実行結果]
"global"

ブロック変数

宣言

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

3.times do |i, x|  # 複数行で書く場合
end

[1, 2, 3].inject {|sum, n| sum + n}  # 1行で書く場合

スコープ

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

a = 99
3.times do |i, x=a|
  a = i*10
  p x
end

[実行結果]

10
10
11

インスタンス変数

宣言

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

@name = "ruby"

スコープ

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

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 
user2.put_name
[実行結果]
"taroo"
"hanako"

クラス変数

宣言

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

@@samurai = "ruby"

スコープ

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

class Samurai
  @@samurai = 1
  def foo
    puts @@samurai
  end
end

person1 = Samurai.new
person1.foo
[実行結果]
1
class Bushi < Samurai
  def hoge
    puts @@samurai
  end
end

person2 = Bushi.new
person2.hoge
[実行結果]
1

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

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

クラスインスタンス変数

宣言

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

@class_instance_var = "ruby"

スコープ

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

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

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

class MyClass
  @class_instance_var = "ruby"
  def self.class_instance_var
    puts @class_instance_var
  end

  def class_instance_var
    puts @class_instance_var
  end
end

instance = MyClass.new
instance.class_instance_var

[実行結果]


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

class MyClass
  @class_instance_var = "ruby"
  def self.class_instance_var
    puts @class_instance_var
  end
  def class_instance_var
    puts @class_instance_var
  end
end

MyClass.class_instance_var
[実行結果]
ruby

クラスメソッドの場合はクラスインスタンス変数にアクセスできます。

class SubClass < MyClass
  def self.class_instance_var_again
    puts @class_instance_var
  end
end

SubClass.class_instance_var_again
[実行結果]

継承したクラスからはクラスインスタンス変数にアクセスできません。

Rubyを独学で頑張っているけど先が見えない方のために

独学でRubyを頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料体験レッスンを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料体験レッスンがぴったりだと断言できます。それくらい無料体験レッスンに自信を持っているのです。

さらに、無料体験レッスンには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料体験レッスン特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料体験レッスン予約はこちら

まとめ

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

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

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

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

関連記事


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

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

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

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

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

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

灰猫

灰猫

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

おすすめコンテンツ

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

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