【Rubyをしっかり理解】いまいち掴めない!attr_accessorって何だろう?

Not image

みなさん、こんにちは。

今回は、Rubyでクラスを定義する時に出てくる「attr_reader」「attr_writer」「attr_accessor」の知識の整理をしようと思います。

みなさんは、これらのメソッドをしっかりと理解していますか?

Rubyの解説書を読んでいると、クラス定義の中にしれっと書かれていることもしばしばあります。

initializeメソッドなどもそうですが、初心者から見るとこれらのメソッドはスッと理解できる代物ではありませんよね。

それらを基本的なことだからと、説明が曖昧になりがちなのです。

確かに、基本的なことに何ページも解説を挟んでしまうと、書籍自体のボリュームが大変なことになってしまうので致し方ないのでしょう。

そこで今回は、「attr_reader」「attr_writer」「attr_accessor」だけに焦点を置いて詳しくまとめていこうと思います。

また言語だけでの説明だとイメージしにくいと思うので、サンプルのプログラムを見ながら説明していこうと思います。

Rubyのattr_accessorなどは、一体何なのか?

attr_reader

attr_readerは、readerという名前の通りインスタンス変数を読み出せるようにすることができます。

下のコードを見てください。

attr_readerを使わないで、同じことをしようとすると上のソースコードの一つ目のクラスのようになります。

どちらのクラスもインスタンス変数を呼び出せるようになっています。

attr_writer

attr_writerの役割は、インスタンス変数を変更することです。参照はできません。

上のコードのattr_writerを使わないパターンの時は、メソッドを呼び出す時にインスタンス変数を変更できるようになっています。メソッドにイコールがついていることで、引数を渡せるようになっています。

attr_writerを使っているパターンでは、attr_readerの時と全く同じ書き方になっていますが、@helloに「Hello, World!」をセットできています。

attr_accessor

attr_accessorは、attr_readerとattr_writerの合わせ技です。インスタンス変数を変更できて、さらに読み出すことができます。

attr_accessorもattr_readerもattr_writerも使わないパターンを見てから、attr_accessorを使うパターンを見るととてもシンプルなコードになっていることがわかります。

また今回はattr_accessorなどの動きに注目してもらうため、initializeメソッドに引数を持たせていませんが、インスタンス生成時に引数を持たせることもできます。

Railsをやったことがある方へ

ここで突然Railsの話になるのですが、コラム的な感じで読んでいただければなと思います。

私たちがRailsでよく使うコードとして、「モデルクラス.new」というものがありますよね。これは「attr_accessor系」の機能を使ってRailsに実装されている?のではないでしょうか?

例えば以下のコードを見てみてください。

Railsのモデルクラスが持っている属性(プロパティ)は、Rubyコードではattr_accessorに設定されていて、インスタンス変数を外部から読み出したり、変更したりできるようになっていると言えます。

上記のコードでは、RailsのコードとRubyのコードが全く同じ値を返します。

Railsのソースコードを深く見たわけではないので、間違っている可能性もありますが、あしからず、、、

まとめ

今回は、Rubyのattr_accessor他、attr系のアクセサメソッドをまとめてきました。「アクセサメソッド」という単語は、今まで出してきませんでした。

ただでさえわからない「attr_accessor」とか「attr_reader」などの単語を説明している時に、さらに新しい単語を入れると混乱するかと考え、あえて出しませんでした。

しかしここまで読んでくれたみなさんは、アクセサメソッドについて理解が進んだのではないでしょうか?

まだまだわからないという方はすみません。私の力不足でした。。。orz

今はわからない点も、時間が経つにつれて自然とわかるようになることもあります。(ここへきて丸投げ)

まあ何はともあれ、みんさんの理解に少しでも役立つことができていたら嬉しいです。読んでいただき、ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です