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.
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. –
Đâ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