【Rubyの基礎】インスタンス変数の基本とattr_accessorの使い方
  • facebookページ
  • twitterページ
  • 2020.11.27

    【Rubyの基礎】インスタンス変数の基本とattr_accessorの使い方

    Rubyのattr_accessorは、クラス内でしか参照できないインスタンス変数を、クラスの外から直接操作できるようにする機能です。今回は、インスタンス変数の基本と、attr_accessorの使い方について解説します。

    attr_accessorはインスタンス変数を扱うメソッド

    Rubyでは、クラスの中でならインスタンス変数を利用できますが、これをクラスの外から直接操作できません。操作するためには、特別な設定が必要です。

    そして、それを簡単に設定できるのが今回紹介するattr_accessorメソッドです。attr_accessorの機能を紹介する前に、インスタンス変数について説明します。

    インスタンス変数の定義

    インスタンス変数とは、クラスをnewメソッドで作成したインスタンス毎に、クラスの中に作られる変数です。クラス内に宣言されたメソッドの中ならどこでも使えますが、クラスの外からは基本的にアクセスできません。

    なお、インスタンス変数は、変数名に「@」を付けて、他の変数と区別されます。

    インスタンス変数

    @変数名

    この例では、クラスが作成された際、インスタンス変数の@nameに、「potepan」を代入します。

    インスタンス変数を外部から操作するには

    同じクラスから複数のインスタンスを作成した場合、外部からインスタンス変数の値を指定するケースはよくあります。しかし、先ほど説明したように、基本的に外部からインスタンス変数を書き換えることはできません。

    例えば、次のような使い方はできません。

    インスタンス変数を外部から書き換えるには、そのためのメソッドを用意しなければなりません。

    Potepanクラスに、インスタンス変数@nameを書き換えるためのメソッドnameを用意したので、このメソッドを使ってインスタンス変数が書き換えられます。

    attr_accessorメソッドの機能

    今回紹介するattr_accessorは、クラスの外からインスタンス変数を書き換えられるようにするメソッドです。つまり、先ほど紹介したインスタンス変数を外部から書き換えるメソッドを、簡単に書けるようにしたメソッドと言えるでしょう。

    attr_accessorメソッドの基本

    次から、attr_accessorメソッドの文法と基本的な使い方について紹介します。

    attr_accessorメソッドの書式

    先ほど説明したように、attr_accessorは、クラスの外からインスタンス変数を書き換えられるようにするメソッドですが、下記のように変数の前に「:」を付けて指定します。

    attr_accessor :変数名

    上の例は、titleというインスタンス変数を、クラスの外からも書き換え可能にします。

    attr_accessorメソッドと同じ定義の書き方

    Rubyのリファレンスマニュアルには、attr_accessorは、下記のメソッドの定義と同じと書かれています。

    この2つのメソッドのうち、上の方はクラスの外からインスタンス変数を参照するためのメソッドです。また、下の方は、書き換えするためのメソッドです。

    このようにattr_accessorは、設定したインスタンス変数を、クラスの外から参照可能にし、さらに、書き換えも可能にしてくれます。このように、attr_accessorは、上記の2つのメソッドの定義を、1行で簡潔に書けるメソッドです。

    attr_accessorメソッドで複数の変数を定義できる

    attr_accessorメソッドでは、複数のインスタンス変数に対して、クラスの外から書き換えられるようにすることが可能です。そして、複数のインスタンス変数を指定する場合は、「,」で区切り、それぞれの変数に「:」を付けます。

    attr_accessorメソッドの使用例

    次から、attr_accessorメソッドを使用したRubyのスクリプトの書き方を、例で紹介しながら解説します。

    インスタンス時に引数として指定する

    Rubyでは、クラスをnewメソッドでインスタンスした際に、引数を渡すことが可能です。そして、その場合、引数をクラスの中で利用するためには、クラスの外からインスタンス変数に値を書き込まなければなりません。そして、この処理で使われるのがattr_accessorメソッドです。

    クラスをインスタンスした際に引数を渡すRubyの書き方を、次の例で説明します。

    上記の例は、Memberというクラスをインスタンスし、引数で指定した文字列をインスタンス変数nameに代入し、クラス内のviewメソッドで表示します。そして、attr_accessorメソッドでインスタンス変数nameを、クラスの外から読み書きできるようにしたので、引数を引き渡すことが可能です。

    インスタンス変数を直接アクセスする

    先ほど、newメソッドの引数で変数を指定する方法を説明しましたが、attr_accessorで宣言することで、変数を直接修正することも可能です。そのため、クラスの外から変数を指定して代入することで、その値をクラスの中で利用できます。また、クラスの外で、クラスの中のインスタンス変数にアクセスが可能です。

    上の例の実行結果は次のとおりで、newメソッドで設定した文字列から、変数に直接代入した文字列に変更することも可能です。

    attr_accessorと同様のメソッド

    attr_accessorを設定したインスタンス変数は、クラスの外から読み込みと書き込みの両方が可能です。Rubyにはattr_accessorと同様のメソッドとして、読み込み専用のメソッドと、書き込み専用のメソッドがあるので、次からこの2つを説明します。

    読み込み専用のメソッド:attr_reader

    attr_readerは、インスタンス変数を、クラスの外から読み込みだけを可能にするメソッドです。そして、使いカは、attr_accessorと同じで、変数に「:」を付けて指定します。

    attr_reader :変数名

    書き込み専用のメソッド:attr_writer

    attr_writerは、インスタンス変数を、クラスの外から書き込みだけを可能にするメソッドです。こちらも使いカがattr_accessorと同じで、変数に「:」を付けて指定します。

    attr_writer :変数名

    まとめ

    Rubyでは、インスタンス変数はクラスの中で使う変数であり、クラスの外からアクセスできません。しかし、attr_accessorクラスを使うことで、書き換えたり、参照することが可能です。

    なお、同じ処理は、その変数にアクセスするメソッドを作成することで、実現できます。しかし、それよりも、attr_accessorを活用すれば、簡潔で読み易いプログラムが書けます。同様に、読み込み専用や書き込み専用のメソッドもあるので、目的に応じて使い分けてください。



    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE