Ruby

Rubyのセッターについて

更新日:

こんにちは、Shinyaです

緊急事態宣言のあとでも建設業界は動き続けております(苦笑)

今回はRubyのセッターについて解説します

超基本で超重要だけど意外と難しいのでしっかり理解するために本記事を作りました

セッターに不安のある人はぜひ読んでくださいね

注:Rubyのオブジェクト指向の知識あること前提です

セッターとは

セッターとはずばり、インスタンス変数の値を変更するためのインスタンスメソッドのことです

曖昧さを無くすためにまず用語の意味を再確認しときましょう

インスタンス変数

  • クラスから作成されるオブジェクト(=インスタンス)ごとに固有の変数
  • 同じクラスから作成されたインスタンス間でも異なる値を持てる
  • クラス内のどのインスタンスメソッドでも使用できる

インスタンスメソッド

  • インスタンスに対してのみ使用可能なメソッド
  • インスタンス変数を扱う処理をする

セッターの書き方・使い方

セッターを記述するときはクラス内で

def [セッター名]=([ローカル変数])
  [インスタンス変数] = [ローカル変数]
end

と書きます

そして使うとき(インスタンス変数の値を変更するとき)は

[インスタンス].[セッター名] = [インスタンス変数の値]

と書きます

具体的には以下のようになります(Userクラスの例)

class User

  #ここから@nameというインスタンス変数用のセッター記述部
  def name=(name)
    @name = name
  end
  #ここまで

end

shinya = User.new

#セッター呼び出し
shinya.name = "Shinya"
#=>Userクラスのインスタンスshinyaのインスタンス変数@nameに"Shinya"が代入された

なぜセッターが要るのか

なぜセッターが必要なのでしょうか?

結論としてはRubyではインスタンス変数をインスタンスメソッド内でしか扱えないようになっているからです

よって、特定のインスタンスのインスタンス変数の値を変更するにはインスタンスメソッドを経由するしかないのです

そのインスタンスメソッドがセッターということになります

実はセッター要らなかったという

こう書くとセッターに失礼ですが、実はセッターを書く必要はないです

というよりあまりに必要過ぎて、同機能を簡便な記述で再現する方法が用意されたのです

その簡便な方法とは attr_writer です

さっきまではセッターを以下のように書いていました

class User

  def name=(name)
    @name = name
  end

end

しかしattr_writerを使うと以下のように一行で書けます

class User

  attr_writer :name

end

セッターを書くのに比べて非常に短く分かりやすいですね

なので一般的にはセッターは書かずにattr_writerを使います

なお、attr_writerは複数のインスタンス変数に対して一挙に使用可能です

attr_writer :name, :age, gender, :hobby

まとめ

以上がRubyのセッターについてでした

セッターを理解するうえで最も重要なのは、セッターが必要な理由だと僕は感じます

呪文のようにとりあえずattr_writerを書くのではなく、インスタンスメソッド経由でしかインスタンス変数を扱えないという背景をしっかり分かっておきましょう

それでは、また

次回はゲッターについて書こうかな

-Ruby
-

Copyright© 初心者のためのプログラミング独学ブログ , 2020 All Rights Reserved Powered by STINGER.