Pipe Operator

This translation is up to date.

Pipe |> lấy kết quả của một biểu thức làm tham số đầu tiên cho một biểu thức khác.

Mục lục

Giới thiệu

Việc lập trình có thể trở nên rối tung, rối đến nỗi mà việc gọi function trở nên lồng ghép và khó đọc hiểu. Ta hãy xem qua ví dụ gọi nhiều function dưới đây:

foo(bar(baz(new_function(other_function()))))

Ở đây, ta đang truyền kết quả của other_function/0 vào new_function/1, rồi lấy kết quả của new_function/1 cho vào baz/1, baz/1 vào bar/1 và cuối cùng là bar/1 vào foo/1. Trong Elixir có cách giải quyết sự rắc rối này bằng cách sử dụng pipe. Pipe (|>) nhận kết quả của một biểu thức, và truyền nó đi. Hãy xem đoạn code ở trên sau khi được viết lại bằng pipe.

other_function() |> new_function() |> baz() |> bar() |> foo()

Pipe nhận kết quả bên trái, và truyền nó qua bên phải.

Ví dụ

Với những ví dụ dưới đây ta sẽ dùng String module của Elixir.

  • Tách chuỗi
iex> "Elixir rocks" |> String.split()
["Elixir", "rocks"]
  • Viết hoa kết hợp tách chuỗi
iex> "Elixir rocks" |> String.upcase() |> String.split()
["ELIXIR", "ROCKS"]
  • Kiểm tra mẫu kết thúc
iex> "elixir" |> String.ends_with?("ixir")
true

Best Practices

Khi function nhận hơn 1 đầu vào, hãy dùng cú pháp gọi function với dấu đóng mở ngoặc (). Việc này giúp các lập trình viên khác không hiểu nhầm code của bạn. Xem ví dụ thứ 3, nếu bỏ đi dấu ngoặc của String.ends_with?/2, sẽ thấy cảnh báo sau.

iex> "elixir" |> String.ends_with? "ixir"
warning: parentheses are required when piping into a function call. For example:

  foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

  foo(1) |> bar(2) |> baz(3)

true
Caught a mistake or want to contribute to the lesson? Edit this page on GitHub!