Làm cách nào để sửa đổi một mảng trong khi tôi đang lặp lại nó trong Ruby?


88

Tôi chỉ đang học Ruby nên xin lỗi nếu đây là quá mới đối với xung quanh đây, nhưng tôi không thể giải quyết vấn đề này từ cuốn sách cái cuốc (có lẽ chỉ là chưa đọc kỹ). Dù sao, nếu tôi có một mảng như vậy:

arr = [1,2,3,4,5]

... và tôi muốn nhân mỗi giá trị trong mảng với 3, tôi đã thực hiện như sau:

arr.each {|item| item *= 3}

... sẽ không mang lại cho tôi những gì tôi muốn (và tôi hiểu tại sao, tôi không sửa đổi chính mảng).

Những gì tôi không nhận được là làm thế nào để sửa đổi mảng ban đầu từ bên trong khối mã sau trình lặp. Tôi chắc rằng điều này là rất dễ dàng.

Câu trả lời:


140

Sử dụng mapđể tạo một mảng mới từ mảng cũ:

arr2 = arr.map {|item| item * 3}

Sử dụng map!để sửa đổi mảng tại chỗ:

arr.map! {|item| item * 3}

Xem nó hoạt động trực tuyến: Ideone


2
Nếu bạn thực sự cần sửa đổi từng yếu tố, sử dụng bản đồ chắc chắn sẽ thanh lịch hơn, imho.
fresskoma

2
Và nếu bạn muốn sửa đổi chính mảng, hãy sử dụng bản đồ! thay vào đó
Yoann Le Touche

18

Để sửa đổi trực tiếp mảng, hãy sử dụng arr.map! {|item| item*3}. Để tạo một mảng mới dựa trên mảng gốc (thường được ưu tiên hơn), hãy sử dụng arr.map {|item| item*3}. Trên thực tế, tôi luôn suy nghĩ kỹ trước khi sử dụng each, bởi vì thường có một chức năng bậc cao hơn như map, selecthoặc chức năng injectđó thực hiện những gì tôi muốn.


Nếu bạn không muốn thực hiện thao tác liệt kê thì sao? Điều gì sẽ xảy ra nếu bạn chỉ muốn làm điều gì đó như arr.map!{ destructive_op}thay đổi vĩnh viễn arr?
ngôi sao sáng

1
@TrevorAlexander: Tôi không chắc ý của bạn. Nó có thể đáng để hỏi như một câu hỏi thực sự với các chi tiết và nội dung.
Chuck

Tôi sẽ phải suy nghĩ về nó. Ngoài việc sửa đổi phần tử rất hẹp, những hoạt động phá hủy nào trên cấu trúc không thể liệt kê được?
ngôi sao sáng

@TrevorAlexander: Tôi vẫn đang khó hiểu. Nếu bạn không thể nhìn vào nội dung của cấu trúc, bạn không thể chuyển đổi nội dung của nó. Nghe có vẻ như bạn không quan tâm đến việc sửa đổi cấu trúc, và thay vào đó chỉ muốn gán một biến - nhưng tôi có thể hiểu nhầm.
Chuck

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.