Rubyではメソッドやブロックの中でしか使えないローカル変数とプログラムの中ならどこでも使えるグローバル変数の他に、オブジェクト内限定でどこでも使えるインスタンス変数が利用できます。
そしてインスタンス変数はRuby on Railsで構築するWebシステムのプログラムでもよく使われる変数です。ぜひ、インスタンス変数の使い方をマスターしましょう。今回はインスタンス変数の仕組みとその使い方について解説します。
Rubyで使える変数の種類
Rubyでプログラムを作る際、変数の参照範囲を正しく理解していなければなりません。特にローカル変数とインスタンス変数の違いが重要です。この2つはRuby on Railsのプログラムでもよく利用される変数なので、正しい理解を身につけましょう。
まずはRubyで使える変数の種類について解説します。
Rubyで使える変数は4種類
Rubyでは、ローカル変数、インスタンス変数、クラス変数、グローバル変数の4種類の変数があります。そしてそれぞれの変数は、最初の1文字によって区別され、その参照範囲が違います。
Rubyの変数の種類
- ローカル変数
変数名が小文字または`_’で始まる変数です。ブロック内またはメソッド定義内でしか参照されません。 - インスタンス変数
変数名が@で始まる変数です。newメソッドで作成したオブジェクトの中に限り、どこからえでも参照できます。通常、オブジェクトの外からは参照されません。 - クラス変数
変数名が@@で始まる変数で、クラス定義の中で共通に使えます。 - グローバル変数
変数名が$で始める変数で、プログラムのどこからでも参照できます。
そもそもインスタンスとは
先ほどインスタンス変数とはnewメソッドで作成したオブジェクトの中でのみ使える変数と紹介しましたが、そもそもインスタンスとは何でしょうか。インスタンスとは英語のinstanceが元になったIT用語で、英語のinstanceには「事実」や「事例」といった意味があります。
オブジェクト指向のプログラム言語では、プログラムコードに定義されている実体を持たないクラスを、実際にコンピュータのメモリーに展開して、実体を持った状態のものをインスタンスと言います。
そしてインスタンス変数は、newメソッドで作られたオブジェクト、すなわちインスタンスの中でのみ参照できる変数です。そして参照範囲がオブジェクト内に限られるので、同じクラスから作られた別のオブジェクトからは参照できません。
インスタンス変数の使い方が重要な理由
インスタンス変数のメリットは、クラスに属する複数のメソッドで、同じ変数を共有できる点です。例えば、オブジェクトを新規に作成した際、インスタンス変数に値を入れておくと、その後、このオブジェクト内のメソッドで、それを定数のように扱えます。
さらにインスタンス変数は、オブジェクト毎に別の変数となるので、同じクラス定義から複数のオブジェクトを生成したとしても、インスタンス変数は別です。それぞれ別の値を格納し、それぞれのオブジェクト内のメソッドで利用できます。
Rubyのインスタンス変数の使い方
インスタンス変数は先ほど紹介したように変数名の先頭に@が付いた、オブジェクトの中でのみ参照できる変数です。ローカル変数はブロックやメソッドの中でしか参照できませんが、インスタンス変数は同じオブジェクトのどのメソッドからでも使えるので、Ruby on Railsなどのプログラムでよく利用される変数です。
インスタンス変数の例
@obiname = name
インスタンス変数の使用例
次にインスタンス変数の使用例を紹介します。
インスタンス変数を利用した例
class Objname def initialize(name) @obiname = name end def showname puts @objname end end name1 = Objname.new("First Name") name2 = Objname.new("Second Name") name1.showname # First Name を表示する name2.showname # Second Name を表示する
上の例はObjnameというクラスでインスタンス変数@objnameを使っています。newメソッドの引数で指定した名前をinitializeメソッドでインスタンス変数に代入し、shownameメソッドで表示しています。そしてこの例のように、newメソッドで作ったオブジェクト毎に違う値を代入し、それを利用可能です。
インスタンス変数を外部から参照するには
インスタンス変数の参照範囲がオブジェクトの中に限られるため、そのままでは別のオブジェクトや上の階層から変数の値を参照できません。しかし、Rubyではインスタンス変数を外部から参照可能にすることが可能です。
次にインスタンス変数の値を参照する方法を紹介します。
インスタンス変数の値を返すメソッドを使う
インスタンス変数の値を返すメソッドを作ることで、間接的にインスタンス変数の値を参照できます。例えば、先ほどの例をインスタンス変数の値を返すメソッドを使う方法に書き直す、次のよう記述できます。
インスタンス変数を返すメソッドの例
class Objname def initialize(name) @obiname = name end def objname @objname end end name1 = Objname.new("First Name") p name1.objname # 'First Name' が表示される
この場合、name1.objnameは、インスタンス変数の@objnameを参照しているのではなく、objnameというメソッドを実行しています。なおobjnameメソッドは、インスタンス変数@objnameを最後に評価するので、その値を返します。
attr_readerメソッドを使う
attr_readerメソッドは、指定したインスタンス変数をオブジェクトの外から直接参照できるようにするメソッドです。もし、直接参照したいインスタンス変数があれば、attr_readerメソッドを利用してください。
ただし、attr_readerメソッドにインスタンス変数を指定する際、変数の最初の文字を「@」から「:」に変えます。このメソッドを使う際に注意してください。
attr_readerメソッドを使った例
class Objname attr_reader :objname def initialize(name) @obiname = name end end name1 = Objname.new("First Name") p name1.objname # 'First Name' が表示される
インスタンス変数を外部から書き換える
先ほど紹介したattr_readerメソッドはインスタンス変数をオブジェクトの外部から直接参照可能にできますが、書き換えはできません。もし外部から書き換えを可能にしたいならattr_writeが利用できます。さらに、参照と書き換えの両方を可能にする場合はattr_accessorメソッドを利用します。
attr_accessorメソッドを使った例
class Objname attr_accessor :objname def initialize(name) @objname = name end end name1 = Objname.new("First Name") p name1.objname "First Name" が表示される name1.objname = "Second Name" p name1.objname "Second Name" が表示される
まとめ
今回紹介したようにRubyでは、ローカル変数、インスタンス変数、クラス変数、グローバル変数が使えます。そして、オブジェクトの中ならどこからでも参照できる変数がインスタンス変数です。Ruby on Railsなどでよく使われる変数なので、ぜひ、その使い方をマスターしてください。
なおインスタンス変数はオブジェクトの外から直接アクセスできませんが、attr_readerメソッドやattr_accessorメソッドを使用することで、オブジェクトの外からも参照できます。必要に応じてこれらのメソッドも活用してください。