LoginSignup
5
3

More than 3 years have passed since last update.

Ruby の `|>` と Elixir の `|>`

Last updated at Posted at 2019-06-13

はじめに

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 になりました :cry:

$ 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)

今度はちゃんと動作しました :tada:

$ 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
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3