webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Rubyをもう一歩進んで勉強する9章(セッターメソッドについて)

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を付けないようにしましょう。

Effective Ruby

Effective Ruby

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング