2020年11月30日月曜日

Ruby の tap を使ってみる

概要

あまり使っていなかった tap の使い方を簡単にまとめてみました

環境

  • macOS 10.15.7
  • Ruby 2.7.2p137

メソッドチェインとして使う

メソッドの返り値を self にすることで自信を返却しメソッドチェインできます
self ではなく self.tap にしても同じです

class MyClass
  def initialize
    @name = "hawk"
  end

  def hello
    print("hello")
    self
  end

  def world
    puts("world")
    self
    # self.tap {}
  end

  attr_reader :name
end

cls = MyClass.new
cls.hello.world

=> helloworld

オブジェクトを tap するとデバッグ的なことができる

tap 自体は self を引数に取って self を return するメソッドです
つまり tap をメソッドチェインすることができます

class MyClass
  def initialize
    @name = "hawk"
  end

  def hello
    print("hello")
    self.tap {}
  end

  def world
    puts("world")
    self
  end

  attr_reader :name
end

cls = MyClass.new
cls.
  tap {|c| puts c.name }.
  tap {|c| c.hello.world }.

=> hawk,helloworld

返り値がほしい場合

tap の最後で break を使うと返り値がもらえます

class MyClass
  def initialize
    @name = "hawk"
  end

  def hello
    print("hello")
    self.tap {}
  end

  def world
    puts("world")
    self
  end

  attr_reader :name
end

cls = MyClass.new
ret = cls.
  tap {|c| puts c.name }.
  tap {|c| c.hello.world }.
  tap {|c| break "break" }
puts ret

=> hawk,helloworld,break

ちなみに break したあとにまた tap することができます
上記の場合は String のオブジェクトが渡されます

最後に

使えるようになると結構便利な機能な気がします
可読性という意味だと tap に慣れていない人だと読みづらくなる場合もあるかもしれません

0 件のコメント:

コメントを投稿