Rubyの「attr_accessor」ってなんぞや、という人へ

Rubyにattr_accessorってメソッドありますよね。こんなのです。

class Book
  attr_accessor :title, :price

  def initialize(title, price)
    @title = title; @price = price
  end
end

「getter」と「setter」を定義してくれるメソッドですが、Rubyからプログラミングを始める初心者殺しだと思ってます。

「getter」と「setter」が何者なのか理解しきれなかった当初は苦しみました。

特にsetterメソッド。

def hogehoge=(val)

ってなんぞや・・・

ということで今回は実際に自分が詰まった箇所「attr_accessor」の説明と

def title=(val)

end

という「setterメソッド」定義の最初の躓きポイントをプログラミング初心者に向けて分かりやすく書いていきます。

スポンサーリンク

def title=(val) ってなんだ

以下のコードにて、「Bookインスタンス」が「インスタンス変数title」を呼び出したり「インスタンス変数price」に値を代入したり出来ているのは「attr_accessor」のおかげです。

ここまでは初心者でも「そういうものなんだ」と理解出来ます。

class Book
  attr_accessor :title, :price

  def initialize(title, price)
    @title = title; @price = price
  end
end

book = Book.new("Programming Ruby", 1980)
puts book.title
book.price = 2000
puts book.price

では、「attr_accessorを使わない場合」の記述を見てみます。

class Book

  def initialize(title, price)
    @title = title; @price = price
  end

  def title
    @title
  end

  def title=(val)
    @title = val
  end

  def price
    @price
  end

  def price=(val)
    @price = val
  end
end

「attr_accessor」を記述しない代わりに、「4つ」インスタンスメソッドが増えました。

単に1つのインスタンス変数にアクセスする代わりに「読み込み用」と「書き込み用」のメソッドを用意しただけです。

初めの頃、ある一行にとても違和感を感じました。

def title=(val)

これです。

def title=(val) の正体

「メソッド定義ってこうやるんだよね?」

def title

「そうそう、def の後に打ち込んだ文字のメソッドが定義される」

じゃあこれは?

def title=(val)

「うわ、文字のあとに変な =(val) が付いている・・・」

これだけで大パニック。今までのメソッド定義の固定観念が覆される衝撃です。
しばらくこのコードの意味不明さには悩みました。

「titleだけのメソッドがあるからこっちが「setter」ってやつに違いないはず・・・」

「そもそもvalってなんだよ・・・」

正解

def title=(val) とは

book.title = “test”

と「title」への代入式を書いた時に呼び出されるメソッド。
決して「title=(val)」という命名のメソッドではない。

分からなかった理由

  1. 「メソッド名」と 「=」 と 「引数」がくっついてたから
  2.  valが何かの魔法のコトバだと思い込んでたから

代入と言ったら title = val のようなスペースを空けた形だけだと考えてました。
また、valも単なるvalueの略で「引数」を表していただけ。

strやらvalやら変数の略称ってたくさんあります。
ただ、プログラミング初心者にはそれが躓く原因となったりします。安易に略すと理解の妨げになる恐れがありそうです。

参考

アクセスメソッド / RubyLife

attr_accessor (Module) / Rubyリファレンス

Railsから入った人へ【attr_accessor】って? / Qiita(@Hassan)

Rubyのメソッド定義について def test = (val); end / teratail