はじめに
Ruby に |>
が入ったというので、試してみました。 Elixir とは微妙に違うことがわかりました。
試した Ruby のバージョンは以下です。
$ ruby -v
ruby 2.7.0dev (2019-06-13T14:04:41Z trunk 56d595198b) [x86_64-darwin18]
Ruby の |>
.
でメソッド呼び出しする代わりに |>
でもメソッド呼び出しすることができるらしいです。
最初、 Elixir と同じことができるようになったのかと勘違いして、以下のコードを試してみました。
NG_pipeline.rb
def square(num)
num**2
end
def cube(num)
num**3
end
def square_cube(num)
num |> square
|> cube
end
p square_cube(2)
残念ながら、 NoMethodError
になりました
$ ruby NG_pipeline.rb
Traceback (most recent call last):
1: from NG_pipeline.rb:14:in `<main>'
NG_pipeline.rb:10:in `square_cube': private method `square' called for 2:Integer (NoMethodError)
.
の代わりに |>
が使えるということなので、オブジェクトのメソッド呼び出しにすれば大丈夫かと思い、以下のようにコードを書き換えてみました。
pipeline.rb
class Numeric
def square
self**2
end
def cube
self**3
end
end
def square_cube(num)
num |> square
|> cube
end
p square_cube(2)
今度はちゃんと動作しました
$ ruby pipeline.rb
64
Elixir だとこんな感じでしょうか。 (Elixir には **
が無いみたいなので、 ベタな書き方にしました。 :math.pow
は使ってませんがご容赦ください。)
pipeline.ex
defmodule SquareCube do
def square(num) do
num * num
end
def cube(num) do
num * num * num
end
def square_cube(num) do
num |> square
|> cube
end
end
IO.puts SquareCube.square_cube(2)
Ruby と Elixir の違い
Elixir では、 |>
の左が関数の第1引数で右がその関数になりますが、 Ruby では |>
の左がオブジェクトで右がそのオブジェクトのメソッドになります。
Ruby
object |> method # => object.method と同じ
Elixir
param |> function # => function(param) と同じ
2019/09/06 追記
その後、この機能は Matzにより revert されました。
現時点では動作しません。
$ ruby -v pipeline.rb
ruby 2.7.0dev (2019-09-06T01:34:33Z master 3b60e5e6bc) [x86_64-darwin18]
pipeline.rb:12: syntax error, unexpected '>'
num |> square