Rubyではメソッド名の末尾に"!"や"?", "="のような非英数字文字を使うことができます。
"!"はメソッドの使用者に注意を促すとき、"?"はメソッドが真偽値を返すのを明示的に表したいときに使ったりします。
たまに、"!"を付けると破壊的メソッドになるとか、真偽値を返すメソッドには必ず"?"を付けなければいけないとか質問されているのを目にしますが、強制力もなければ、メソッド名でメソッドの中身が変わることもありません。
しかし、"="が付いたメソッドは少し特別な意味を持ちます。
スポンサーリンク
"="が末尾についたメソッドはセッターメソッドになります。
セッターメソッドとは、インスタンスのあるメンバ変数に値をセットするためのメソッドで、Rubyでは以下のように定義することができます。
class User def name=(v) @name = v end end
これは引数を1つだけ取る'name='という名前のメソッドを定義したことになり、
u = User.new u.name=("Jon")
というように使えます。
ですが、面白いことに、"="が末尾についたメソッドに関しては(他にも+や-も)名前と等号の間にスペースを入れることができるので、変数に代入するかのようにメソッドを呼び出すことができます。
u = User.new u.name = "Jon"
また、ゲッターメソッドも定義することで、メンバ変数の読み書きができるようになります。
class User def name @name end def name=(v) @name = v end end
u = User.new u.name = "Jon" u.name #=> "Jon"
全ての変数についてゲッター・セッターメソッドを定義するのは大変なので、ゲッター・セッターメソッドを定義するメソッドも用意されています。
attr_writer
はセッターメソッドを定義するメソッドです。
class User attr_writer :name, :age end
とすることで、nameとageについてセッターメソッドを一気に定義することができます。
同じように、attr_reader
はゲッターメソッド、attr_accessor
はゲッター・セッター両方を一度に定義することが来ます。
ここで、一つ注意が必要です。
メソッドの内部からセッターメソッドを呼ぶ場合は、必ずselfをレシーバに明示的に書かなくてはいけません。
class User attr_accessor: name def initialize(name) self.name = name end end
selfを付けないと、メソッド内部のローカル変数への代入なのか、セッターメソッドの呼び出しなのか曖昧であるため、セッターメソッドを呼ぶときはselfを必ずつけないといけません。
逆にセッターメソッドでなければ、selfを付ける意味はないので、selfを付けないようにしましょう。
- 作者: Peter J. Jones,arton,長尾高弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/09
- メディア: 大型本
- この商品を含むブログ (13件) を見る
Ruby on Rails 5アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/14
- メディア: 大型本
- この商品を含むブログを見る
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る