Không có sự khác biệt, trên thực tế map
được triển khai trong C như rb_ary_collect
và enum_collect
(ví dụ: có một sự khác biệt giữa map
trên một mảng và trên bất kỳ enum nào khác, nhưng không có sự khác biệt giữa map
và collect
).
Tại sao cả hai map
và collect
tồn tại trong Ruby? Các map
chức năng có nhiều công ước đặt tên trong ngôn ngữ khác nhau. Wikipedia cung cấp một cái nhìn tổng quan :
Hàm bản đồ có nguồn gốc từ các ngôn ngữ lập trình chức năng nhưng ngày nay được hỗ trợ (hoặc có thể được xác định) bằng nhiều ngôn ngữ theo thủ tục, hướng đối tượng và đa mô hình: Trong Thư viện mẫu chuẩn của C ++, được gọi là transform
, trong C # (3.0) Thư viện LINQ, nó được cung cấp như một phương thức mở rộng được gọi là Select
. Bản đồ cũng là một hoạt động được sử dụng thường xuyên trong các ngôn ngữ cấp cao như Perl, Python và Ruby; các hoạt động được gọi map
trong cả ba ngôn ngữ này. Một collect
bí danh cho bản đồ cũng được cung cấp trong Ruby (từ Smalltalk) [nhấn mạnh của tôi]. Lisp chung cung cấp một nhóm các chức năng giống như bản đồ; hành vi tương ứng với hành vi được mô tả ở đây được gọi là mapcar
(-car biểu thị quyền truy cập bằng thao tác CAR).
Ruby cung cấp một bí danh cho các lập trình viên từ thế giới Smalltalk để cảm thấy thoải mái hơn khi ở nhà.
Tại sao có một triển khai khác nhau cho mảng và enum? Một enum là một cấu trúc lặp tổng quát, có nghĩa là không có cách nào mà Ruby có thể dự đoán được phần tử tiếp theo có thể là gì (bạn có thể định nghĩa các enum vô hạn, xem Prime chẳng hạn). Do đó, nó phải gọi một hàm để lấy từng phần tử liên tiếp (thông thường đây sẽ là each
phương thức).
Mảng là bộ sưu tập phổ biến nhất vì vậy rất hợp lý để tối ưu hóa hiệu suất của chúng. Vì Ruby biết rất nhiều về cách các mảng hoạt động, nó không phải gọi each
mà chỉ có thể sử dụng thao tác con trỏ đơn giản , nhanh hơn đáng kể.
Tối ưu hóa tương tự tồn tại cho một số phương thức Array như zip
hoặc count
.
map
được ưa thích tại Code Golf .