【Rails】アクセサメソッドについて(attr_reader, attr_writter, attr_accessor)
こんにちは
一週間ぶりの投稿です。
今日はアクセサメソッドについて自分なりにまとめていきたいと思います。色々な記事を見ましたが、こちらの記事がすごく分かりやすかったです。
http://bryankawa.hatenablog.com/entry/2017/01/28/150537
アクセサメソッドとは
Rubyなどのオブジェクト指向プログラミング言語で用意されているメソッド。Rubyを学習しているのでRubyで言いますと、クラス内のインスタンス変数にクラス外からアクセスするために用意されているメソッドのことで、主に下の3つがあります。
・attr_reader
・attr_writter
・attr_accessor
オブジェクト指向においてインスタンス内の変数は内部の状態を表すもので、外から直に参照すべきではないという考え方に基づきます。
アクセサメソッドはなぜ必要か
アクセサメソッドの必要性を例を用いて説明していきます。
例①
class Gear end gear = Gear.new puts gear.cog # => undefined method 'cog'
例①ではcogメソッドを実行しようとしていますが、クラス内にcogメソッドを定義していないので、当然 No Method Errorとなります。
例②
class Gear def cog @cog end end gear = Gear.new gear.cog # => nil gear.cog = "10" # => undefined method "cog="
例②では無事cogメソッドを実行することができました。が@cogの値を書き込むことはできていません。
例③
class Gear def cog @cog end def cog=(str) @cog = str end end gear = Gear.new gear.cog = "10" puts gear.cog # => 10
例③ではクラス外部からインスタンス変数に書き込み及び読み込みができています。
毎回こんなに書くのがめんどくさいので、下のように省略して書くことができます。
class Gear attr_reader :cog # ゲッターと呼ばれる attr_writter :cog # セッターと呼ばれる end gear = Gear.new gear.cog = "10" puts gear.cog # => 10
また、さらに下記のように省略することもできます。
class Gear attr_accessor :cog end gear = Gear.new gear.cog = "10" puts gear.cog # => 10
アクセサメソッドの必要性について何となくでも分かっていただけたでしょうか。クラス外部からインスタンス変数の読み書きをしたい場合に必要だということですね。
今回は以上になります。
非常に基礎的なところではありますが、すごく勉強になりました。
ここまで読んでくださり、ありがとうございました。分かりにくいやアドバイス等ありましたらコメントくださると幸いです。では!