rubyメソッドチェーンの作り方

今日はメソッドチェーンの作り方を教えてもらいました。

応用が利くことになると思うので、備忘録的に書いておきます。

メソッドチェーンとは

メソッドチェーンとは、メソッドをつなげていくものです。

サンプルです

'hoGe'.downcase.upcase => 'HOGE'

作り方

前のメソッドの戻り値と同じオブジェクトに合わせることです。

class Car
  def initialize
    @name = 'car'
    @mileage = 10000
  end

  def set_name(name)
    @name = name
  end

  def set_mileage(mileage)
    @mileage = mileage
  end
end

car = Car.new
car.set_name('hoge').set_mileage(50000) => undefined method `set_mileage' for "hoge":String (NoMethodError)
p car

上記の場合はエラーになります。

原因は、set_nameの値がオブジェクトに合わないからです。

stringで終わっているので、Carクラスで終わらせるようにしましょう。

class Car
  def initialize
    @name = 'car'
    @mileage = 10000
  end

  def set_name(name)
    @name = name
    self
  end

  def set_mileage(mileage)
    @mileage = mileage
    self
  end
end

car = Car.new
car.set_name('hoge').set_mileage(50000)
p car => #<Car:0x007f9d1a064870 @name="hoge", @mileage=50000>

まとめ

戻り値の種類を意識することが必要になる。