Elixir cho dân Ruby - Phần 3
elixir
25
Ruby
106
White

Lơi Rệ viết ngày 05/05/2016

Chưa xem phần 2? Xem phần 2

Trong bài viết này tôi giới thiệu cho các bạn về khái niệm function arity, một cách gọi mĩ miều của số lượng argument của hàm. Tại sao arity lại quan trọng trong Elixir?

Function Arity là gì?

Function Arity là cái tên hoành tá tràng của "Hàm này có bao nhiêu argument". Với ví dụ sau:

defmodule LeRoiTopHits do
  def play(bai1, bai2) do
  end
end

ở đây hàm LeRoiTopHits.play sẽ có arity là 2, và mà 'tiếng lóng' dân Elixir nói chuyện với nhau là LeRoiTopHits.play /2, lưu ý dấu /. Nên nhớ cách gọi này khi nói chuyện với các chuyên gia.

Tại sao chúng ta quan tâm arity?

Một khái niệm mới cho dân Ruby đây, vì trong Elixir, hai hàm cùng tên mà có khác số arity là hai hàm khác nhau. Hả?! Cái gì cơ? nói lại 1 tí xem, vâng để tôi lấy một ví dụ của Ruby trước nhé:

module LeRoiTopHits
  def self.play(bai1, bai2)
  end
end

# rồi sau đó tiếp tục định nghĩa thêm
module LeRoiTopHits
  def self.play(bai1)
  end
end

ở ví dụ trên thì hàm LeRoiTopHits.play(bai1) sẽ ghi đè lên hàm cũ, và trên thực tế chỉ có 1 hàm và hàm được định nghĩa lại. Nhưng với Elixir thì lại khác:

defmodule LeRoiTopHits do
  def play(bai1, bai2) do # <-- LeRoiTopHits.play /2
  end

  def play(bai1) do # <-- LeRoiTopHits.play /1
  end
end

bạn có thể gọi được 2 phiên bản của hàm play:

LeRoiTopHits.play('Tình đơn phương', 'Ngày trở về')
LeRoiTopHits.play('Tình đơn phương')

Vâng, tuy là cùng tên hàm nhưng logic bên trong có thể hoàn toàn khác nhau tuỳ vào số argument người dùng cung cấp. Thường thì không có nghĩa lắm nếu 2 logic khác nhau hoàn toàn, đa số các trường hợp là bổ trợ cho nhau.

Và cũng thường thấy pattern là hàm nào có số arity thấp thường delegate (uỷ thác) cho hàm cùng tên với số arity cao hơn, kèm theo một giá trị argument mặc định. Chúng ta hãy cùng xem một ví dụ:

defmodule LeRoiTopHits do
  def play(bai1) do
    play(bai1, "Tình đơn phương")
  end

  def play(bai1, bai2) do
  end
end

ở trên chúng ta thấy là LeRoiTopHits.play /1 sẽ cung cấp argument số 2 với giá trị mặc định là "Tình đơn phương" cho LeRoiTopHits.play /2.

Cái pattern này trở nên rất thông dụng đến nỗi Elixir cung cấp một cách viết ngắn với từ khoá \\, ví dụ trên có thể được viết thành:

defmodule LeRoiTopHits do
  def play(bai1, bai2 \\ "Tình đơn phương") do
  end
end

Ngoài ra chúng ta có thể kết hợp giá trị mặc định cho nhiều argument khác:

defmodule LeRoiTopHits do
  def play(bai1, bai2 \\ "Tình đơn phương", bai3 \\ "Tra tấn") do
  end
end

Code ở trên sẽ tạo ra 3 hàm: LeRoiTopHits.play /1, LeRoiTopHits.play /2 và `LeRoiTopHits.play /3.

Bởi vì arity giúp phân biệt rõ ràng hàm cùng tên nên chúng ta có thể xoá bỏ hoàn toàn các câu lệnh if/else của Ruby.

Kết luận

Function Arity là số argument một hàm nhận vào. Hàm có cùng tên nhưng khác arity được xem như khác nhau, và sử dụng từ khoá \\ để cài giá trị mặc định của một argument. Với arity, chúng ta có thể xoá bỏ hoàn toàn các câu lệnh if/else.

Trong bài tiếp theo, chúng ta sẽ bàn về function encapsulation, cách import module và cách tạo alias.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Lơi Rệ

43 bài viết.
206 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
65 12
Sự sống còn của các công ty kỹ thuật phụ thuộc vào nguồn nhân lực chất xám của họ. Thế nên rất thiết yếu cho việc đầu tư xây dựng team có khả năng ...
Lơi Rệ viết gần 2 năm trước
65 12
White
38 7
Trời se se lạnh, Melbourne chuyển mùa, ngồi trong quán cafe bắt đầu một ngày làm việc mới với suy nghĩ tại sao các bạn Việt Nam không muốn tham gia...
Lơi Rệ viết gần 3 năm trước
38 7
White
36 15
Thế nào là làm việc từ xa? Internet, một trong những phát minh vĩ đại nhất của con người thế kỷ 20. Công nghệ này xoả bỏ rào cản vật lý giữa các n...
Lơi Rệ viết 2 năm trước
36 15
Bài viết liên quan
White
0 0
Custom Ecto.Type Version hiện tại của Ecto.Type không support một số datatype sử dụng khi validate. Ví dụ như MapSet. Thành ra đành phải tự viết đ...
Vie viết 8 tháng trước
0 0
White
0 1
Tìm nhanh package trên (Link) Thanh công cụ tìm kiếm của (Link) có hỗ trợ một số tham số để hỗ trợ tìm chính xác hơn. name: Tìm kiếm chính xác t...
Cẩm Huỳnh viết 7 tháng trước
0 1
White
3 0
Bài viết này là bản dịch chương 3 cuốn (Link) Đây là một cuốn sách rất hay nói về các cách sử dụng Ecto cũng như tư tưởng đằng sau việc thiết kế A...
kiennt viết 1 năm trước
3 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
43 bài viết.
206 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!