注目キーワード
  1. 機械学習
  2. プログラミング
  3. 副業
NO IMAGE

【Ruby入門】インスタンス変数、クラス変数、グローバル変数の違いをまとめて解説

  • 2020年7月25日
  • 2020年7月23日
  • 未分類
  • 621view

テックキャンプを卒業して絶賛転職活動中のライト( @LIGHTS0602)です。

 

私はテックキャンプに入る前はhtmlやcssは勉強していましたがそれまではコピペコードや仕組みについては全く理解していませんでした。

 

なので最初、クラス変数やインスタンス変数というのをrubyやRuby on Railsで使い始めた時、「???」とチンプンカンプンでした。

 

ですが変数やメソッドの使い方はRubyの中では基礎中の基礎なのでまずは変数の種類や使い方について覚えていきましょう。

 

Rubyでの変数とは

初心者の方にとって変数と変数と言われても中々イメージが付きにくいかもしれません。

 

色々な方が変数は箱のようなものと教えていますが、Rubyでは少し勝手が違っています。

 

Rubyではラベルという表現が正解です。

 

例えばRubyで変数として1などの数値や「Hello Word!」などの文字列、変数の「num」などはすべてオブジェクトになります。

 

Rubyで使える変数の種類

Rubyでの変数の種類は

・クラス変数

・インスタンス変数

・ローカル変数

・クラスインスタンス変数

・グローバル変数

などがあります。

 

それぞれ特徴やメリット、記述方法の違いについて紹介していきます。

 

クラス変数とは

まずはクラス変数から見ていきましょう。

 

・クラス変数とは

クラス変数はクラスから作成された全てのオブジェクトで共有される変数

 

クラス変数はすべてのオブジェクト、メソッドで共有されるため、別のオブジェクトでクラス変数を参照すると更新された値を取得することができます。

 

・クラス変数の書き方

クラス変数の書き方は「@@」で始まって記述していきます。

 

例えば「@@num」のように記載します。

 

クラス変数の特徴

ではクラス変数の特徴をまとめてみましょう。

 

・クラス変数の特徴

・変数目の先頭に@@を付けて記述する

・別のインスタンスであっても同じクラスから生成されたものであれば変数が共有できる

・継承したクラスでも変数を使える

となっています。

 

クラス変数のメリット

ではクラス変数のメリットとはいったい何なのでしょうか?

 

クラス変数のメリットとしてはクラス変数で定義した別のオブジェクトを利用できることです。

 

つまりクラスから作成されたすべてのオブジェクトで共有することができます。

 

クラス変数のプログラム例

ではクラス変数の書き方を見ていきましょう。

 

class man

    @@count = 0

 

    def initialize(name=”未定義”)

      @name = name

      @@count +=1

    end

 

    def getCount()

        return @@count;

    end

end

 

name1 = Man.new(“taro”)

name2 = Man.new(“ichiro)

name3 = Man.new(“yuuki)

 

print(“現在の男の子は”,name1.getcount(),”人です”)

 

と記述すると出力される結果は

現在の男の子は3人です

となります。

 

では次にインスタンス変数を見ていきましょう。   

 

インスタンス変数とは

インスタンス変数とはインスタンス毎に別々の値を保存することができる変数のことをいいます。

 

ただしクラス変数と違ってインスタンス変数はオブジェクトの外からはアクセスすることができません。

 

もしオブジェクトの外からインスタンス変数にアクセスしたい場合はクラスに定義するしなければいけません。

 

ではインスタンス変数の特徴をもう少し見ていきましょう。

 

インスタンス変数の特徴

ではインスタンス変数の特徴は何があるのでしょうか?

 

インスタンス変数の特徴

・インスタンス変数にアクセスできるのはinitializeメソッドとオブジェクトのインスタンスメソッドだけ

・initializeメソッドで初期定義をしてからインスタンスメソッドで変更したり、参照、更新していく

 

という特徴があります。

 

インスタンス変数を定義する場合は

「@」を付けて定義するようにしましょう。

 

例えば

Class Student

  def setName(name)

    @name = name

  end

 

  def dispName

    puts @name

  end

end

 

name1 = Name.new

name1.setName(“taro”)

 

name1.dispName

 

とすると出力されるのは

taro

となります。

 

また今回は@nameのようにインスタンス変数がメソッドの中に1つしかありませんでしたが複数のインスタンス変数を定義して使う場合もあります。

 

インスタンス変数のメリット

ではインスタンス変数のメリットやクラス変数との使い分けについてみていきましょう。

 

インスタンス変数はクラス変数と違いメソッド間で定義することができるので変数を細かく分けたいときにとても便利です。

 

実際に具体例を見ながらの方がわかりやすいかもしれません。

 

インスタンス変数のプログラム例

例えば以下の使用のプログラムを作るとします。

 

・Studentクラスを定義する

・Studentは名前、年齢、性別を持つ

・Studentは人数を保持して取得できる

・Studentのインスタンスは3つの方法で作成する

 

Student.new

→名前、年齢、性別を指定して初期化

 

Student.male

→名前、年齢を指定して内部的に男性として初期化する

 

Student.female

→名前、年齢を指定して内部的に女性として初期化する

 

・インスタンスhelloで挨拶をする

 

class Student

  @@size = 0

  FEMALE = :female

  MALE = :male

 

  def self.male(name, age)

    new(name, age, MALE)

  end

 

  def self.female(name, age)

    new(name, age, FEMALE)

  end

 

  def size

    @@size

  end

 

  def initialize(name, age, sex)

    @@size +=1

    @name, @age, @sex = name, age, sex

  end

  

  def hello

    put <<-EOS

こんにちは。

私は#{@name}です

年齢は#{@age}です

性別は#{@sex}です

    EOS

  end

end

 

student = [

  Student.new(‘inoue’, 17, Student::MALE)

  Student.new(‘matumoto’, 16, Student::MALE)

  Student.new(‘asaoka’, 18, Student::FEMALE)

]

 

student.each { |student|student.hello}

 

puts “#{Student.size}人います” 

 

と入力した場合、この出力結果は

 

こんにちわ。

私は inoue です。

年齢は 17 です。

性別は male です。

こんにちわ。

私は matumoto です。

年齢は 16 です。

性別は male です。

こんにちわ。

私は asaoka です。

年齢は 18 です。

性別は female です。

 

3人います

 

と出力されます。

 

ローカル変数とは

ローカル変数は変数の中で一番よくつかわれるものです。

 

基本的な変数ともなります。

 

まずは宣言方法を見ていきましょう。

 

ローカル変数を宣言するときには英数字と_(アンダーバー)を使うようにしましょう。

注意としてローカル変数の頭に数字はもってこれませんので気を付けましょう。

 

ではローカル変数の特徴を見ていきましょう。

 

ローカル変数の特徴

ローカル変数の特徴としてメソッドやブロック内で変数を定義した場合はそのメソッドやブロック内でしか使えません。

 

なのでローカル変数を一度抜けてしまえば消えてしまいます。

 

違うメソッドに同じローカル変数を定義しても全く違う変数として扱われるのです。

 

ローカル変数のプログラム例

ではローカル変数の使い方を見ていきましょう。

 

class Subject

  def study(sub)

    subjec_name = sub

    “私は#{subject_name}が好きです”

  end

end

 

subject = Subject.new(‘math’)

subject.study

 

と記述すると

 

出力結果は

“私はmathが好きです”

となります。

 

このようにインスタンス変数はメソッド内で定義したものはその中でしか使えないので注意しましょう。

 

では最後にクラスインスタンス変数をみていきましょう。

 

クラスインスタンス変数とは

クラスインスタンス変数とクラス変数ってなんか似ていてどっちがどっちかわかりませんよね。

 

クラスインスタンス変数はほかのオブジェクトと同じようにクラスにインスタンス変数を持つことができます。

 

そのクラスにできたインスタンス変数をクラスインスタンス変数と呼びます。

 

クラスインスタンス変数の特徴

ではクラスインスタンス変数の特徴を見ていきましょう。

 

クラスインスタンス変数とインスタンス変数はよく間違われるのですがクラスインスタンス変数は孫クラスのみでしか参照できない変数のことです。

 

そしてインスタンス変数はインスタンスごとに持つ変数のことです。

 

しっかりとイメージできるようにサンプルプログラムを確認してクラスインスタンス変数とインスタンス変数、クラス変数の違いをはっきりさせましょう。

 

クラスインスタンス変数のプログラム例

class Myclass

  @@class_var = “クラス変数” #クラス変数

  @class_instance_var = “クラスインスタンス変数” #クラスインスタンス変数

 

  #クラス変数を取得する

  def self.class_var

    @@class_var

  end

 

  #クラスインスタンス変数を取得

  def self.class_instance_var

    @class_instance_var

  end

 

  #インスタンス変数を取得

  def instance_var

    @instance_var = “インスタンス変数” #インスタンス変数

  end

end

 

# 派生クラス

class Derived < MyClass; end

 

puts MyClass.class_var

puts MyClass.class_instance_var

puts MyClass.new.instance_var

 

puts Drived.class_var

puts Derived.class_instance_var

 

とすると出力するのは

クラス変数

クラスインスタンス変数

インスタンス変数

クラス変数

nil

 

となります。

 

では最後にグローバル変数とは何かを見ていきましょう。

 

グローバル変数とは

グローバル変数とはそのプロジェクト内でどこでも使用できる変数になります。

 

どこで定義してもどこからでも使用できる変数であり、とても便利ではあるのですが変数が同じの場合、エラーが出てしまうので注意して使用しないといけません。

 

グローバル変数の定義

ではグローバル変数の定義を見ていきましょう。

 

グローバル変数を定義するときは

$変数名 = 値

 

のように変数名の頭に$を付ける必要があります。

 

グローバル変数の注意点

グローバル変数の注意点は同じ名前が重複すると値が勝手に上書きされてしまい、エラーになってしまう可能性があることです。

 

なのでスコープが広いと一見便利のように感じるのですが注意して使用しなければいけません。

 

ではグローバル変数の書き方を見ていきましょう。

 

グローバル変数のプログラム例

def subject()

  puts $sub

end

 

$sub = “math”

 

puts $math

subject()

 

と記述するとどうなるのでしょうか?

 

出力結果は

math

math

 

と表示されます。

 

まとめ

 

今回のまとめ

・変数は様々な種類の変数があり、それぞれの特徴があるので最適な場所で変数を使う

・ローカル変数やインスタンス変数はよく使う変数でありスコープが狭いので使いやすい

・グローバル変数はスコープが広いが変数が重複する可能性があるので注意が必要

 

いかがでしたでしょうか?

 

今回はRubyの変数の種類や特徴書き方について紹介してきました。

 

まずはRubyの基本である変数やメソッドを覚えてしっかりと基礎を定着してから様々なアプリを開発していった方がバグがでにくくなります。

 

なので何回も変数の意味や使い方を復習してしっかりとマスターしておきましょう。

NO IMAGE
最新情報をチェックしよう!
>ハッキングログ~人生をハッキングする~

ハッキングログ~人生をハッキングする~

機械学習やプログラミング、副業の情報発信メディアです。 人生を豊かにするための情報を発信していきます。

CTR IMG