【Ruby】インスタンス変数の使い方 | クラス変数・クラスインスタンス変数との違いもご紹介します

みなさんこんにちは!

今回の記事は、

悩みを抱えた人
・インスタンス変数ってなに?
・インスタンス変数の使い方が知りたい!
・インスタンス変数とクラス変数/クラスインスタンス変数の違いってなに?

というお悩みを解決する記事になっています。


この記事の内容

・インスタンス変数とは?
・インスタンス変数の使い方
・attr_accessorを使ってインスタンス変数へアクセスする方法
・インスタンス変数とクラス変数/クラスインスタンス変数の違い


傍楽たろう
なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。

おすすめ記事

みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]

Rubyとは?その特徴や将来性、おすすめの学習方法まで網羅的にご紹介します


インスタンス変数とは?

インスタンス変数とは、Rubyで定義できる変数の1つです。

オブジェクト指向の考えに基づき、クラスから生成したインスタンスについて、インスタンス自身の性質や状態を保存するために定義します。

例えば、会員制のショッピングサイトを例に挙げて考えてみましょう。

ショッピングサイトを利用するには、ユーザーに関する情報をプログラム内で保有する必要があります。

具体的には、ユーザー名・メールアドレス・生年月日・住所など、さまざまです。

これらの情報は、各々のユーザーに紐づく情報であり、インスタンス変数によって保持されるべき情報であるといえます。

インスタンス変数の使い方

続いて、インスタンス変数の基本的な使い方について見ていきましょう。

インスタンス変数を定義する

まずは、インスタンス変数を定義する方法について解説します。

とは言っても定義自体はとても簡単で、クラス内で定義したメソッドでアットマーク「@」を前に付けて変数を作成することで定義できます。

例として、商品に関する情報を持つ「Productクラス」の中で、商品名を保有するインスタンス変数「product_name」を定義してみましょう。

以下のサンプルコードをご覧ください。

# 商品クラス
class Product
  # 商品名を設定
  def setProductName(name)
    # インスタンス変数は変数名にアットマーク[@]をつけて定義する
    @product_name = name
  end
end

注意点としては、インスタンス変数はメソッドの内側で定義するということです。

メソッドの外側(クラス名の直下)で定義した変数は「クラスインスタンス変数」と呼ばれ、インスタンス変数とは異なる振る舞いを持ちます。

詳しくは、後節「クラスインスタンス変数とは?」で詳しく解説します。

インスタンス変数へアクセスする

つづいて、インスタンス変数へアクセスする方法について解説します。

とはいえ、こちらもそれほど難しくはなく、それぞれ以下の形でインスタンス変数をセットする or 呼び出すことが可能です。

  • インスタンス変数をセットする
    →クラスのメソッド内で代入式を定義する
  • インスタンス変数を呼び出す
    →インスタンスをレシーバにしてメソッドを呼び出す

実際のコードは以下の通りになります。

class Product
  # 商品名をセットする
  def setProductName(name)
    @name = name
  end

  # 商品名を表示する
  def displayProductName
    puts @name
  end
end

# 商品クラスを基にインスタンスを生成
product = Product.new

# 商品名をセットする
product.setProductName("Ruby初心者向け教本")

# 商品名を表示する
product.displayProductName

# 実行結果
=> "Ruby初心者向け教本"

クラス変数とは?

クラス変数は、元となるクラスから生成したすべてのインスタンスで共通の状態を保有します。

例えば、会員制のショッピングサイトでユーザー情報を管理する「Userクラス」が存在し、現在ログインしているユーザーの数をカウントしたいとしましょう。

この場合、ユーザー数という情報はインスタンスごとに保有するものではなく、クラス変数として持つべき情報であるといえます。

対して、ユーザー名という情報は利用する人で異なり、インスタンスごとに持たせるべき情報、つまりインスタンス変数で持つべき情報であると言えます。

クラス変数の使い方

クラス変数を定義するには、変数名の前に「@@」をつけます。

具体的な使い方は以下の通りになります。

# ユーザークラス
class User
  # ログインユーザー数
  @@loginUserCount = 0

  def initialize(name)
    # ユーザー名設定
    @name = name
  end

  # ログイン処理
  def login
    @@loginUserCount += 1
  end

  # ログインユーザー数取得
  def loginUserCount
    @@loginUserCount
  end
end

user_1 = User.new("サンプル太郎")
user_2 = User.new("サンプル花子")

# user_1のみログインする
user_1.login

# user_1、user_2それぞれを使ってログインユーザー数を出力
p user_1.loginUserCount
p user_2.loginUserCount

# クラス変数のため、ログインユーザー数は同じ
=> 1
=> 1

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

インスタンス変数は、インスタンスメソッドの中で定義することで取り扱えることを説明してきました。

一方、クラス直下にインスタンス変数を定義することもでき、それは「クラスインスタンス変数」と呼ばれています。

クラスインスタンス変数は、インスタンス変数とは異なり、インスタンスメソッドからアクセスできない一方で、クラスメソッドからアクセスできます

クラスメソッドからアクセスインスタンスメソッドからアクセス
インスタンス変数不可能可能
クラスインスタンス変数可能不可能

クラスインスタンス変数の使い方

以下のサンプルコードで、インスタンス変数とクラスインスタンス変数の違いを見てみましょう。

class Music
  # クラスインスタンス変数
  @genre = 'pop'

  def initialize(name)
    # インスタンス変数
    @name = name
  end

  def displayFromInstanceMethod
    # インスタンスメソッドからインスタンス変数にアクセス
    # →アクセス可能
    p @name

    # インスタンスメソッドからクラスインスタンス変数にアクセス
    # →アクセス不可
    p @genre
  end

  def self.displayFromClassMethod
    # クラスメソッドからインスタンス変数にアクセス
    # →アクセス不可
    p @name

    # クラスメソッドからクラスインスタンス変数にアクセス
    # →アクセス可能
    p @genre
  end
end

sample_music = Music.new("世界に一つだけの花")

sample_music.displayFromInstanceMethod
=> "世界に一つだけの花"

Music.displayFromClassMethod
=> nil

最後に

さて、今回は、Rubyのインスタンス変数の使い方、そしてクラス変数とクラスインスタンス変数との違いについて解説してきましたがいかがでしたか?

「インスタンス変数」という言葉だけを聞くと少し難しく感じてしまうかもしれませんが、ご説明した通り、その宣言方法は「@」をつけるだけで大丈夫で、その使い方もそれほど難しくはなかったかと思います。

ただし、クラス変数/クラスインスタンス変数と混同してしまいがちですので、その違いについてはしっかりと理解しておきましょう。

また、RubyのフレームワークであるRuby on Railsでもこの「インスタンス変数」は頻繁に登場します。

今回の記事でしっかりとマスターして、今後の開発でも積極的に使っていってくださいね。

傍楽たろう
Ruby on Railsについて詳しく知りたい方は、ぜひ以下の記事を確認してみてくださいね。

おすすめ記事

今回は、いまやWebアプリ開発の定番フレームワークとなりつつあるRuby on Rails(以下「Rails」とします)についてお話しさせて頂きます。 Web上で公開されているアプリケーションの中にもRailsを使用しているものは非[…]

railsロゴ

このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。

最後まで読んで頂きありがとうございました。