Rubyの「attr_accessor」ってどういう意味があるの?

Rubyにattr_accessorってメソッドありますよね。

getterとsetterを定義してくれるメソッドですが、とても初心者殺しだと思ってます。

Rubyからプログラミングを初めて、getterとsetterが何者なのか理解しきれなかった当初は苦しみました。

特にsetterメソッドの理解には時間がかかりました。

def hogehoge=(val)

ってなんぞや・・・

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

def title=(val)

end

というsetterメソッド定義の躓きポイントについて書いていきます。

スポンサーリンク

def title=(val) ってなんだ

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やら変数の略称ってたくさんあります。
ただ、それがプログラミング初心者には躓く原因となるかもしれないので、安易に略すと理解の妨げになる恐れがありそうです。

参考サイト

フォローする

スポンサーリンク