2013-05-23 47 views
5

Một phần của mã của tôi là như sau:Làm thế nào để vuông mỗi phần tử của một mảng trong lớp Array trong Ruby?

class Array 
    def square! 
    self.map {|num| num ** 2} 
    self 
    end 
end 

Khi tôi gọi:

[1,2,3].square! 

tôi mong muốn nhận được [1,4,9], nhưng thay vào đó tôi nhận được [1,2,3 ]. Tại sao điều này là trường hợp? Khi tôi gọi:

[1,2,3].map {|num| num ** 2} 

ngoài phương pháp lớp học, tôi nhận được câu trả lời đúng.

+0

Bất kỳ lý do (hiệu suất?) Để phá hủy các mảng ban đầu (tuyên bố/bắt buộc) thay vì trả lại một cái mới (expression/functional)? – tokland

+0

Bạn sử dụng 'map' để tạo một mảng các ô vuông, và sau đó chỉ cần vứt nó đi và trả về' self'. – RocketR

Trả lời

9

Bạn phải sử dụng Array#map!, không phải Array#map.

Array#map ->Gọi khối đã cho một lần cho mỗi phần tử của tự. Tạo một mảng mới chứa các giá trị được trả về bởi khối.

Array#map! ->Gọi khối đã cho một lần cho mỗi phần tử của bản thân, thay thế phần tử bằng giá trị được khối trả về.

class Array 
    def square! 
    self.map! {|num| num ** 2} 
    end 
end 

[1,2,3].square! #=> [1, 4, 9] 
+0

Ah, hoàn hảo. Cảm ơn bạn! – mrdziuban

+2

Và bạn có thể bỏ qua dòng 'self'. 'self.map! {..} 'đã trả về mảng – ovhaag

Các vấn đề liên quan