Chociaż zaakceptowana odpowiedź jest w porządku w przypadku łańcuchów i innych niezmiennych obiektów, myślę, że warto rozwinąć komentarz Maxa na temat obiektów zmiennych.
Powiedzmy chcesz wypełnić tablicę elementów z 5 pustych skrótów:
xs = Array.new(3) { {} }
Powyższy zwróci tablicę z następujących czynności:
[{}, {}, {}]
Jeśli następnie zmodyfikować pierwszy element tablicy:
xs.first[:hello] = "world"
Tylko pierwszy element zostanie zmodyfikowany.
xs # => [{ hello: "world" }, {}, {}]
Z drugiej strony, przy zastosowaniu Array.new(3, {})
przyniesie tablicę z elementów wskazujących na ten sam mieszania:
xs = Array.new(3, {}) # => [{}, {}, {}]
xs.first[:hello] = "world"
xs # => [{ hello: "world" }, { hello: "world" }, { hello: "world" }]
która prawdopodobnie nie jest zamierzony wynik.
Dziękujemy! i dzięki Markowi, ale muszę to zaakceptować, ponieważ jest tak elegancko. str był ciągiem przed ... po prostu zmienił go na stackoverflow. –
To jest poprawne rozwiązanie dla obiektów niezmiennych (Fixnums, Symbole itp.), Ale dla obiektów zmiennych (Ciągi, Tablice itp.) Otrzymasz Tablicę z 5 punktami do obiektu _same, co prawdopodobnie nie jest tym, czego potrzebujesz. W takim przypadku użyj bloku z formą 'Array.new (5) {" foo "}'. – Max