こんにちは、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を書くのではなく、インスタンスメソッド経由でしかインスタンス変数を扱えないという背景をしっかり分かっておきましょう
それでは、また
次回はゲッターについて書こうかな