👻
[Feature #20770] パイプライン演算子を追加するチケット
[Feature #20770] A new pipe operator proposal
- パイプライン演算子を追加する提案
- 例えば以下のようなコードの場合
value = half(square(add(value, 3)))
-
#then
を使うと以下のように記述できる
value = value.then { add(_1, 3) }.then { square(_1) }.then { half(_1) }
- これをパイプライン演算子
|>
を用いて簡略的に書きたいという提案
value = add(value, 3) |> square(_1) |> half(_1)
- いわゆるよくある?パイプライン演算子?ですね?
- 議論は盛り上がっているんですが個人的に Ruby だとオブジェクトをレシーバとしてメソッドを呼び出すことが殆どで
g(f(x))
みたいな関数っぽく処理を呼び出すコードを書くことはあんまりないのでそこまで有用には見えないんですよねえ- とはいえ、まったくないわけではないので局所的に便利になるところはなくはない
- 発展する流れとしては
.then{}
を.{}
と簡略化する話もでてますね-
.call()
を.()
と簡略化できるのと同じ粒度で
-
client_api_url
.then { URI.parse(it) }
.then { Net::HTTP.get(it) }
.then { JSON.parse(it).fetch(important_key) }
- が以下のようにかけるイメージ
client_api_url
.{ URI.parse(it) }
.{ Net::HTTP.get(it) }
.{ JSON.parse(it).fetch(important_key) }
- ちなみにパイプライン演算子だとこう
client_api_url
|> URI.parse(it)
|> Net::HTTP.get(it)
|> JSON.parse(it).fetch(important_key)
- 上記のコードだときれいそうに見えるけど
g(f(x))
がx. { f(_1) }.{ g(_1) }
みたいになるのはちょっとなんかイマイチに見える…
Discussion