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

みなさんこんにちは!

今回の記事は、

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

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


この記事の内容

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


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

おすすめ記事

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

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

レバテックフリーランス … 業界最大級の案件数業界トップクラスの高単価報酬を誇る最大手のサービスです。実績豊富なコーディネーターが丁寧な対応をしてくれるため、案件の無理な提案はありません。フリーランスで生きていくためにはまず登録しておきましょう。
MidWorks … フリーランス賠償責任保障生命保険の折半など、フリーランスでありながらも正社員並みの保障を受けられるのが特徴です。また、経験豊富なキャリアコンサルタントによる手厚いサポートも受けられるため、安定したフリーランス生活を送りたい方には特におすすめのサービスです。
ポテパンフリーランス … IT業界・技術に詳しいコンサルタントが担当してくれるため、こちらの要望をきちんと理解した上で案件を紹介してくれます。また、案件情報のみならず、フリーランスのイロハについても教えてくれるため、フリーランスとして初めて活動される方には特におすすめのサービスです。

レバテックキャリア … ITエンジニアが利用したい転職エージェントNo.1にも選ばれており、年収600万円以上のハイクラス求人を5,000件以上も保有しています。エンジニアが転職を考えた時にまず初めに登録しておくべきサービスです。
Tech Stars Agent … Tech Stars Agentでは、担当エージェントが全員エンジニア出身のため、スキルやキャリアを見据えたきめ細かな転職支援が受けられます。運営元の株式会社Branding Engineerは、独立支援サービス「MidWorks」も展開しているため、独立を視野に入れたサポートも受けられます
転職ドラフト … 年収UP率93.8%/平均年収UP額126万円と圧倒的な年収UP率を誇るイベント型のエンジニア向け 転職サービスです。毎月1回開催され、厳選された優良IT/Web系企業約150社からダイレクトスカウトを受け取ることができます。年収アップを目指す方は登録必須です。


インスタンス変数とは?

インスタンス変数とは、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ロゴ

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

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