Tôi thích phong cách chức năng này:
module Enumerable
def diff
each_cons(2).map {|pair| pair.reverse.reduce :-}
end
end
EDIT: Tôi chỉ nhận ra rằng reverse
là hoàn toàn không cần thiết. Nếu đây là ngôn ngữ chức năng, tôi đã sử dụng tính năng khớp mẫu, nhưng Ruby không hỗ trợ khớp mẫu. Tuy nhiên, nó không, hỗ trợ liên kết phá hủy, là một xấp xỉ đủ tốt để khớp mẫu trong trường hợp này.
each_cons(2).map {|first, second| second - first}
Không có mặt cười.
Tôi thích âm thanh này như thế nào nếu bạn chỉ đọc to từ trái sang phải: "Đối với mỗi cặp, hãy áp dụng sự khác biệt giữa phần tử thứ nhất và thứ hai của cặp." Trong thực tế, tôi thường không thích tên collect
và thích map
thay vào đó, nhưng trong trường hợp này mà đọc thậm chí tốt hơn: "Đối với mỗi cặp, thu phần chênh lệch giữa các thành phần của nó"
each_cons(2).collect {|first, second| second - first}
Âm thanh gần giống như định nghĩa về sự khác biệt thứ tự đầu tiên.
Nguồn
2009-10-17 11:18:25
Điều này thật dễ thương, nhưng khá kém hiệu quả nếu các mảng nhận được lớn ... –
một giải pháp tương thích tốt 1.8. cảm ơn. – Peter
Bạn có thể sử dụng liên kết phá hủy trong khối thay vì lập chỉ mục: '{| đầu tiên, thứ hai | thứ nhất - thứ hai} '. Ngoài ra, trên 1.8.7+ 'self [1 ..- 1]' tương đương với 'drop (1)', làm cho toàn bộ thứ được đọc như sau: 'drop (1) .zip (self) .collect {| first , thứ hai | thứ nhất - thứ hai} '. Một lần nữa, ngay cả khi bạn không biết Ruby và đọc to như tiếng Anh, nó gần như dễ hiểu, giống như định nghĩa toán học về sự khác biệt thứ tự đầu tiên: "Kết hợp Array với chính nó được dịch chuyển bằng cách tính toán sự khác biệt và thu thập kết quả . " –