Phải học Enumerable khi học Ruby
Ruby
116
functional
8
White

Ngoc Dao viết ngày 20/03/2016

Enumerable trong Ruby tương đương với collection trong Java. Nói theo thuật ngữ Java, thì Enumerable là interface được những class như Array, Hash, Set implement. Còn nói theo thuật ngữ Ruby, thì module Enumerable được những class trên include.

Việc rành rẽ các phương thức trong Enumerable là bước tiến lớn khi học Ruby. Nó cũng là chuyển tiếp quan trọng giúp bạn dần tư duy theo phong cách functional, là phong cách rất mốt hiện tại. Rành rẽ chúng xong, khi học sang Java 8, Scala, Erlang v.v. bạn sẽ thấy rất thoải mái, vì chúng cũng có mặt trong thư viện chuẩn của các ngôn ngữ này.

Bài viết này giới thiệu vài method tiện dụng của Enumerable, nếu dùng chương trình sẽ súc tích và sáng sủa. Phần ví dụ dùng array cho thống nhất, nói chung chúng vẫn đúng nếu thay array bằng hash hay cái gì đó đã include module này.

map/collect

Biến array a1 thành array a2 có cùng số phần tử, dùng map (có alias là collect) rất tiện. Ý tưởng của nó chính là phép ánh xạ y = f(x) trong toán học, để biến từng phần tử x của a1 thành phần tử y của a2.

Ví dụ từ a1 chứa tên ảnh, ta muốn tạo a2 chứa URL có dạng y = http://my/path/x. Nếu chỉ quen với C, ta viết như sau:

a1 = ['asian.jpg', 'ebony.jpg']

a2 = [] # Initialize
a1.each do |e|
a2 << "http://my/path/#{e}"
end

Nếu dùng map:

a1 = ['asian.jpg', 'ebony.jpg']
a2 = a1.map { |e| "http://my/path/#{e}" }

Thần chú: Biến array thành array cùng kích thước: dùng map

select/find_all

Muốn chọn những phần tử thoả mãn điều kiện nào đó từ array, ta dùng select (có alias là find_all). Trái nghĩa với select là reject.

a = [1, 2, 3, 4]
evens = a.select { |e| i%2 == 0 }

Thần chú: Biến array thành array nhỏ hơn: dùng select

inject

Khi muốn tạo giá trị scalar (1 chiều) từ các phần tử của array (đa chiều), ví dụ để tính tổng của các phần tử, thường ta viết như sau:

a = [1, 2, 3]

sum = 0
a.each do |e|
sum += e
end

Nếu dùng inject:

a = [1, 2, 3]
sum = a.inject(0) { |tmp, e| tmp += e }

Thần chú: Kết hợp tất cả phần tử của array thành một biến duy nhất: dùng inject

join

Thật ra join chỉ có trong Array. Rất nhiều khi ta muốn nối các phần tử của array lại thành một chuỗi, cách nhau bởi dấu phẩy chẳng hạn. Nếu tự viết thì rất lắt nhắt vì dấu phẩy phải nằm xen kẽ giữa các phần tử.

Dùng join thì ta chỉ cần viết đơn giản như sau:

a = [1, 2, 3]
s = a.join(", ") # => "1, 2, 3"

Thần chú: Nối tất cả phần tử của array thành chuỗi: dùng join

any? và all?

Khi muốn kiểm tra trong tập hợp có ít nhất một phần tử thỏa mãn tính chất nào đó hay không, ta dùng any?. Khi muốn kiểm tra xem tất cả phần tử có thỏa mãn tính chất nào đó hay không, ta dùng all?

a = [1, 2, 3]
at_least_less_than_2 = a.any? { |e| e < 2 }
all_less_than_2 = a.all? { |e| e < 2 }

Tóm lại, nếu cần hơn 1, 2 dòng để thao tác trên array, hãy tham khảo tài liệu của Enumerable gấp.

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

Ngoc Dao

102 bài viết.
300 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
66 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết gần 3 năm trước
66 8
White
42 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
42 1
White
38 2
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
38 2
Bài viết liên quan
White
8 6
Chưa xem phần 2? Xem (Link) 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 ...
Lơi Rệ viết 3 năm trước
8 6
White
8 1
Tiếp theo (Link) Mình sẽ hướng dẫn cách test căn bản cho API mình tạo. Thật ra mà nói thì mình phải viết test trước khi làm nhưng mà để tránh việc...
My Mai viết hơn 3 năm trước
8 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
300 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á!