IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

RubyビギナーのためのStep upコラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第10回 クラスインスタンス変数と特異クラス・特異メソッド(1) (中越智哉) 2019年2月

みなさん、こんにちは。
今日はひさびさに(初めて?)コラムタイトルの「Step up」にふさわしいテーマを取り上げたいと思います。

Rubyでクラスを定義した際、よく用いる変数に、インスタンス変数とクラス変数があるのは皆さんご存じではないかと思います。インスタンス変数は変数名の先頭が「@」で始まり、インスタンスごとにそれぞれ個別の値を保持することができます。クラス変数は変数名の先頭が「@@」で始まり、インスタンスの有無にかかわらず、クラスごとにただ一つの値を保持することができます。

それはすでに知っています、という方がほとんどかと思います。では、このインスタンス変数を初期化する場合、どこにどのように記述するでしょうか。

Rubyではインスタンス生成時に同時に必ず実行されるメソッドとしてinitializeメソッドがありますから、ここでインスタンス変数を初期化するのが無難ですね。

たとえば、こんなイメージです。

fig01

上記プログラムを実行すると

@bar は 123

と表示されますね。

しかしながら、他言語(Javaなど)でプログラミングした経験のある方は、クラスのメンバ変数(フィールド)を宣言する場合、クラス配下に直接記述することが多いと思いますので

fig02

と、書きたくなる方もいるのではないでしょうか。しかし、これを実行すると

@bar は

と表示されてしまいます。これは、どういうことなのでしょうか。

実はRubyではメンバメソッド配下ではなく、クラス配下に直接定義したインスタンス変数は「クラスインスタンス変数」と呼ばれ、通常のインスタンス変数とは区別して用いられます。クラスインスタンス変数は、その見た目とは異なり、インスタンスメソッドからはアクセスできず、クラスメソッドからはアクセスできるようになっています。

例えば、以下のようなプログラムを作成して、

fig03

これを実行しますと、

インスタンス変数@bar は 
クラスインスタンス変数@bar は 123

と表示されることがわかります。実は、クラスインスタンス変数はクラスインスタンスにのみ属するインスタンス変数なのですが、「クラスインスタンス」って何?と思われる方もいらっしゃいますよね。

オブジェクト指向のクラスとインスタンスを「クラス=鯛焼きの型」と「インスタンス=鯛焼き」に例えて考えてみましょう。

クラスはインスタンスを作るために必要な「定義(鯛焼きの型)」ではありますが、「鯛焼きの型」それ自体にも「実体」がなければ、鯛焼きを焼く(インスタンスを作る)ことはできませんよね。

つまり、クラスを定義して利用しようとするときには、常にクラスそれ自体(鯛焼きの型)を示すインスタンス=クラスインスタンスが存在しているということになるのです。クラスインスタンス変数とは、そのクラスインスタンスでだけ使えるインスタンス変数と考えれば良いことになります。

何気なく定義したつもりのインスタンス変数が、そのままでは使えず、悩んでしまった経験をお持ちの方もいらっしゃるのではないでしょうか。それには実はこんな理由があったのです。

この「クラスインスタンス変数」の謎を掘り下げていくと、さらに「特異クラス」「特異メソッド」についても知る必要が出てきます。

そのあたりについては、次回のコラムでさらにご説明したいと思います。

どうぞお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes