|>運算子稱為管道運算子。它可以用來把一連串的函式呼叫串接起來,讓前一次函式呼叫所回傳的值,作為下一次函式呼叫的第一個引數傳入。
String.replace_suffix(String.upcase(String.duplicate("go ", 3)), " ", "!")
# versus
"go "
|> String.duplicate(3)
|> String.upcase()
|> String.replace_suffix(" ", "!")
它也可以寫在單一行裡:
"go " |> String.duplicate(3) |> String.upcase() |> String.replace_suffix(" ", "!")
Kernel函式通常到處都能省略Kernel模組名稱來使用,但在管道串接中使用這些函式時,就必須寫出模組名稱。舉例來說,2 * 3 == 6也可以寫成:
2 |> Kernel.*(3) |> Kernel.==(6)
什麼時候該用管道運算子、什麼時候不該用,純粹是個人偏好。有些 Elixir 開發者喜歡遵循這些規則:
只有單一次函式呼叫時,不要使用管道運算子。
# do
String.split("hello", "")
# don't
"hello" |> String.split("")
不要在管道串接中直接建立匿名函式。
# do
take_n_letters = fn n -> Enum.take(?a..?z, n) end
2 |> Kernel.*(3) |> take_n_letters.()
# don't
2 |> Kernel.*(3) |> (fn n -> Enum.take(?a..?z, n) end).()
管道串接一律以變數或字面值開頭,不要以函式呼叫開頭。
# do
"hello" |> String.upcase() |> String.split("")
# don't
String.upcase("hello") |> String.split("")