2011-04-16 27 views

Trả lời

48

Các side effects đều giống nhau mà sẽ bổ sung một số nhầm lẫn với kỹ thuật đảo ngược của bạn.

Vâng, cả hai lặp qua mảng (trên thực tế, bất cứ điều gì mà mixes in Enumerable) nhưng đồ sẽ trả về một mảng bao gồm các kết quả khối trong khi mỗi sẽ chỉ trả lại mảng gốc. Giá trị trả về của mỗi hiếm khi được sử dụng trong mã Ruby nhưng bản đồ là một trong số most important functional tools.

BTW, bạn có thể có một thời gian khó khăn để tìm tài liệu vì đồ là một phương pháp trong Enumerable khi mỗi (một trong những phương pháp theo yêu cầu của Enumerable mô-đun) là một phương pháp trong Mảng .

Lưu ý: Bản đồ triển khai dựa trên mỗi.

+5

+1 để liên kết "bản đồ" với lập trình hàm. "mỗi" mặt khác là vòng lặp bắt buộc thông thường với các tác dụng phụ. – tokland

+3

Rất hữu ích, cảm ơn. –

+0

Bản đồ không có vẻ rất 'chức năng' bởi vì việc thay đổi đối tượng được đề cập sẽ thay đổi đối tượng gốc –

2

Bản đồ mảng # là tập hợp bất kỳ thứ gì được trả lại trong phần bị chặn cho từng phần tử.

Mỗi mảng thực thi khối mã cho từng phần tử, sau đó trả về chính danh sách.

Bạn nên kiểm tra này Array#each vs. Array#map

2

Mỗi chỉ là một iterator mà được các yếu tố tiếp theo của một iterable và nguồn cấp dữ liệu đến một khối. Bản đồ được sử dụng để lặp lại nhưng ánh xạ các phần tử thành một phần tử khác, như một giá trị nhân với một hằng số. Trong ví dụ của bạn, chúng có thể được sử dụng thay thế cho nhau, nhưng mỗi cái là một trình lặp vòng chung chung hơn chuyển phần tử đó tới một khối.

7

định nghĩa từ tài liệu API: mỗi: Chặn cuộc gọi một lần cho từng phần tử trong tự, chuyển phần tử đó làm tham số. bản đồ: gọi khối một lần cho từng phần tử của bản thân. Tạo một mảng mới chứa các giá trị được trả về bởi khối.

vì vậy mỗi một vòng lặp thông thường, mà lặp qua từng phần tử và gọi cho khối

bản đồ thường được sử dụng nơi bạn muốn một mảng ánh xạ bởi một số logic để một hiện hữu. Bạn cũng có thể chuyển phương thức làm tham chiếu đến chức năng bản đồ như

[1,2,3].map(&:to_s) 
Các vấn đề liên quan