Programming from 30

自分の備忘録が、誰かの為になれば・・

Rubyのアクセサメソッドについて

学習したはずのアクセサメソッド。

class Car
  attr_accessor :name ,:price

  def initialize(name,price)
    @name = name
    @price = price
  end
end

car = Car.new('Prius',250_000)
car.name
=> 'Prius'
car.price
=> 250_000

以上のコードを見て、バカな私は

def name
  @name = name
end

のように定義してないじゃないか!!!!!!!!!!
何で使えるんだ?!の様に変な思考に入り、混迷を極めてしまった。もしかしたらmoduleクラスのnameメソッドを使っているのかと調べてドキュメントを見ても、見当違いの事が書いてあった。悩んで解決せず、メンターの駒形さんに聞くと、「アクセサメソッドにはセッターとゲッターがあって、nameメソッドを定義していると一緒の事になる」と説明を頂き、クリアになると共に、cherry本でやったではないかと、自分のばかさにホトホト呆れるほかありませんでした。 もしかしたら同じ失敗をして時間を無駄にしようとしている人、そして自分の備忘録の為に書きました。もう忘れません! 因みにattr_accessorattr_readerattr_writerを一緒にまとめたもので、

class Car
  attr_reader :name ,:price

  # 同義
  # def name
  #      @name
  #end
  # def price
  #      @price
  #end

  attr_writer :name,:price
   
   #同義
   #def name=(value)
   #  @name = (value)
   #end
   #def  price=(value)
   #   @price = (value)
   #  end

  def initialize(name,price)
    @name = name
    @price = price
  end
end

car = Car.new('Prius',250_000)
car.name
=> 'Prius'
car.price
=> 250_000
car.name = 'Crown'   # イコールの両サイドにスペース!
=> 'Crown'

と書く事ができ、通常同義の部分はdef initializeなどの下から定義するのですが、比較の為attr の後に記述しました。 何かあればご指摘いただけると幸いです!