Pipeline operatorはまだホットな状態で(2019–06–15現在)、今後も変更が加わる可能性が高いのですが、現状において質問の意味を推測すると、pipeline operator (|>) において、当初
- 1 |>+ 2 #=> 3 (1.+(2) と同じ意味に解釈されるから)
となる仕様だったのを禁止したのはなぜかということですが、単に読みやすさに貢献しないからです。それだけでなく積極的に読みにくさに貢献してますね。
Pipeline operatorは以下の指摘があり、もっともだと思う点もあるのでなんらかの対処を考えています。
- ElixirやElm、F#などの言語では a |> b は b(a) の意味であり、同じ演算子で意味が異なるのは良くない。
- 今後、Rubyで上記の意味の演算子を追加したくなった時に既に |> 演算子が使われているのは困る
- a = 1 |> b が a = (1 |> b) ではなく (a=1) |> b と解釈されるのは嬉しくない。
- 必要性が高くない
(1)については、Rubyにおいてはレシーバーはメソッドの第1引数と考えることができるので、 a.b(1) は他言語における b(a,1) のようなものなので a |> b(1) が a.b(1) と解釈されることにあまり抵抗はなかったのですが、Rubyユーザーのメンタルモデルが意外に柔軟性にかけていたのは驚きでした。pipeline operatorという名前にしたのも原因かもしれません。chaining operatorとでも呼べばよかったかもしれません。
(2) についてはまあ将来の話なのでおいときましょう。(4)もまあ重要ではありません。(3)は確かにその通りだと思うので、優先順位の調整について検討しましょう。
今後については、
- まあ、これだけ反対されたのだからあきらめる
- 名前(pipeline)と演算子(|>)のどちらかあるいは両方を変えて残す
- 現状のまま強行
のいずれかになると思いますが、まだ、決心できていません。まあ、こうやってユーザーの話を聞くのは良いことです。気がついていなかったこともわかるし。
追記[2019–08–29]
本日付けでRubyからpipeline operatorは削除されました。ユーザーが期待するものとの解離が私が当初想定した以上に大きかったからです。また別の名前、別の演算子が思いつけば再チャレンジということもあるかもしれません。