2014-06-26 12 views
21

Chcę wypełnić tablicę 1 elementem, ale 5 razy. Co mam do tej pory.Wypełnij tablicę z elementem N razy

str = 1234 
a = [] 

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

Działa, ale nie jest to sposób rubinowy. Czy ktoś może wskazać mi właściwy kierunek, aby zainicjować tablicę z 5 razy tą samą wartością?

Odpowiedz

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

nawiasem mówiąc, jest to zła praktyka nazwać zmienną str która jest przypisana wartość 1234. To wprowadza zamieszanie.

+1

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

+10

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

15

To powinno działać:

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

To stwarza niepotrzebną tablicę pośredni, który jest natychmiast wyrzucić. – sawa

4

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.

0

Możesz wypełnić tablicę tak:

a = [] 
=> [] 

a.fill("_", 0..5) 
=> ["_", "_", "_", "_", "_"]