Help us understand the problem. What is going on with this article?

Object#tapでbreak(値)すると値を返せる、のはなぜ?

More than 1 year has passed since last update.

https://ruby-doc.org/core-2.4.1/Object.html#method-i-tap

image.png

公式っぽいドキュメントにはbreakしたら値が戻るとは書いてないんだけど、なぜかそうなる裏テク。
https://www.google.co.jp/search?q=rails+tap+break

コード見ても元のobjが返りそう。
なんでなんで。
rb_yieldはobjを書き換えるのか?

yieldしたprocの中でbreak

def aaa
  yield
  return "123"
end

aaa{ break "456" } #=> "456"

これだー。
絶対"123"しか返さなさそうなaaaが"456"を返す。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#break

でもそんなこと書いてない。裏テク?

ブロックの中から 制御構造/break により中断された場合

ブロック付きメソッドの戻り値は、通常のメソッドと同様ですが、ブロックの中から 制御構造/break により中断された場合は nil を返します。

break に引数を指定した場合はその値がブロック付きメソッドの戻り値になります。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#block

これだなあ。
callbackとして渡したblock内でまちがってbreakすると意図しないreturnになっちゃうということだ。
やっぱり裏テクだった。

Object#as

https://stackoverflow.com/questions/7878687/combinatory-method-like-tap-but-able-to-return-a-different-value

class Object
  def as
    yield self
  end
end

キレイでよさそう。

> "1112222".delete("-").as{|x| x[0,3] + "-" + x[3,4]}
=> "111-2222"

> "111-2222".delete("-").as{|x| x[0,3] + "-" + x[3,4]}
=> "111-2222"

> "111-2222".delete("-").tap{|x| break(x[0,3] + "-" + x[3,4]) }
=> "111-2222"

> "1112222".delete("-").tap{|x| break(x[0,3] + "-" + x[3,4]) }
=> "111-2222"
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away