Câu hỏi Làm thế nào để sửa đổi một mảng trong khi tôi đang lặp qua nó trong Ruby?


Tôi chỉ học Ruby vì vậy xin lỗi nếu đây là những người mới chơi ở đây, nhưng tôi không thể làm việc này từ cuốn sách cuốc cuốc (có lẽ không đọ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, giả sử, nhân mỗi giá trị trong mảng với 3, tôi đã làm việc ra rằng làm như sau:

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

... sẽ không 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 bản thân mảng).

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


76
2017-11-21 00:07


gốc




Các câu trả lời:


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


121
2017-11-21 00:09



Nếu bạn thực sự cần phải sửa đổi từng phần tử, việc sử dụng bản đồ chắc chắn sẽ thanh lịch hơn, imho. - fresskoma
Và nếu bạn muốn sửa đổi bản thân mảng, hãy sử dụng bản đồ! thay thế - Yoann Le Touche


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


16
2017-11-21 00:44



Nếu bạn không muốn thực hiện một hoạt động liệt kê thì sao? Nếu bạn chỉ muốn làm một cái gì đó như arr.map!{ destructive_op} để thay đổi vĩnh viễn arr? - bright-star
@TrevorAlexander: Tôi không chắc ý bạn là gì. Nó có thể là giá trị yêu cầu như một câu hỏi thực sự với các chi tiết và các công cụ. - Chuck
Tôi sẽ phải suy nghĩ về nó. Khác với sự thay đổi yếu tố rất hẹp, những hoạt động phá hoại trên cấu trúc nào không phải là liệt kê? - bright-star
@TrevorAlexander: Tôi vẫn còn có một thời gian khó hiểu. Nếu bạn không thể xem nội dung của một cấu trúc, bạn không thể chuyển đổi nội dung của nó. 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 lầm. - Chuck


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

5
2018-06-06 12:57