2014-06-26 16 views
21

Tôi muốn điền vào một mảng có 1 phần tử nhưng 5 lần. Những gì tôi đã có cho đến nay.Điền mảng với phần tử N lần

str = 1234 
a = [] 

5.times { a << str } 
puts a # => 1234, 1234, 1234, 1234, 1234 

Nó hoạt động nhưng điều này cảm thấy không phải là cách ruby. Ai đó có thể chỉ cho tôi đúng hướng để bắt đầu một mảng với 5 lần giá trị giống nhau không?

Trả lời

39
Array.new(5, str) 
# => [1234, 1234, 1234, 1234, 1234] 

Bằng cách này, nó là một thực tế xấu đến tên một biến str được gán giá trị 1234. Nó là khó hiểu.

+1

Cảm ơn bạn! và cảm ơn Marek nhưng tôi phải chấp nhận điều này vì nó rất thanh lịch. str là một chuỗi trước khi ... chỉ cần thay đổi nó cho stackoverflow. –

+10

Đây là giải pháp đúng cho các đối tượng bất biến (Fixnums, Symbols, vv) nhưng đối với các đối tượng có thể thay đổi (Strings, Arrays,…) bạn sẽ nhận được một Array với 5 con trỏ tới đối tượng _same, có lẽ không phải là thứ bạn muốn. Trong trường hợp đó, sử dụng dạng khối 'Array.new (5) {" foo "}'. – Max

15

này nên làm việc:

[1234] * 5 
# => [1234, 1234, 1234, 1234, 1234] 
+3

Điều này tạo ra một mảng trung gian không cần thiết đó là ngay lập tức vứt bỏ. – sawa

4

Mặc dù câu trả lời được chấp nhận là tốt trong trường hợp của chuỗi và các đối tượng không thay đổi khác, tôi nghĩ rằng nó đáng để mở rộng nhận xét của Max về các đối tượng có thể thay đổi.

Hãy nói rằng bạn muốn điền vào một loạt các yếu tố với 5 băm rỗng:

xs = Array.new(3) { {} } 

trên sẽ trả về một mảng các nội dung sau:

[{}, {}, {}] 

Nếu bạn sau đó sửa đổi các yếu tố đầu tiên của mảng:

xs.first[:hello] = "world" 

Chỉ thành phần đầu tiên mới được sửa đổi.

xs # => [{ hello: "world" }, {}, {}] 

Mặt khác, sử dụng Array.new(3, {}) sẽ mang lại một mảng với tất cả các yếu tố trỏ đến cùng bảng băm:

xs = Array.new(3, {}) # => [{}, {}, {}] 
xs.first[:hello] = "world" 
xs # => [{ hello: "world" }, { hello: "world" }, { hello: "world" }] 

mà có lẽ không phải là kết quả mong muốn.

0

Bạn có thể điền mảng như thế này:

a = [] 
=> [] 

a.fill("_", 0..5) 
=> ["_", "_", "_", "_", "_"] 
Các vấn đề liên quan