一直被忽视的tap方法

ruby的任何object,都带有一个奇怪的method,:tap

tap接受一个block,把自身作为参数传递到block中,并执行block中的内容,最后返回自身。

引用文档的说明
:tap 就像轻拍一下,试探以下该对象的反应,做一些操作,然后仍然返回该object。

如果不使用:tap,我们需要输入数组内容时候,有以下做法。

1
2
3
4
arr = "hello".bytes.to_a
p arr
arr = arr.collect {|byte| byte.to_s(16) }
p arr

有了:tap,我们就可以写成长到像一口老痰的一句话形式。

1
2
"hello".bytes.to_a.tap {|arr| p arr }
.collect {|byte| byte.to_s(16) }.tap {|arr| p arr }

算了吧,我还是喜欢不用:tap的形式。至少看到文档中的这个例子我是这么想的。

不过今天总算是看到利用tab可以写的略简单明了的地方了。

我以前常犯这个错误。

1
user = User.new(name: "gyorou", age: 26).save

你们猜user结果是啥? 嗯。结果是 true。 因为:save返回的结果是true或者false。

那我们怎么获取user?

1
2
user = User.new(name: "gyorou", age: 26)
user.save

但是写成两行的话这里就比较难受了。利用:tap,我们可以写成一行。

1
user = User.new(name: "gyorou", age: 26).tap(&:save)

时间瞬间变得清爽。可见,:tap也是有存在的道理,只不过文档没能让人信服而已罢了。

以上。

如果你觉得本文对你有帮助,请给我点赞助。