Jak zainicjować tablicę w jednym kroku przy użyciu Rubiego?

105

Inicjalizuję tablicę w ten sposób:

array = Array.new
array << '1' << '2' << '3'

Czy można to zrobić w jednym kroku? Jeśli tak to jak?

user502052
źródło
20
+1 tylko za nowe, powtarzające się pchanie pojedynczej linii :)
Phrogz
1
@Phrogz nieco krócej:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel,
@AlexanderSuraphel To tworzy tablicę liczb stałych zamiast tablicy ciągów.
Phrogz
1
@Phrogz Chciałem tylko wspomnieć, że może być nawet krótszy. Po prostu trzeba się do zmian 1na '1'.
Alexander Suraphel

Odpowiedzi:

192

Możesz użyć literału tablicowego:

array = [ '1', '2', '3' ]

Możesz również użyć zakresu:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

W przypadku tablic ciągów rozdzielanych białymi znakami można użyć składni ciągu procentowego :

array = %w[ 1 2 3 ]

Możesz również przekazać blok, aby Array.newokreślić, jaka będzie wartość dla każdego wpisu:

array = Array.new(3) { |i| (i+1).to_s }

Na koniec, chociaż nie generuje tej samej tablicy trzech ciągów, co inne odpowiedzi powyżej, zauważ również, że możesz użyć modułów wyliczających w Ruby 1.8.7+ do tworzenia tablic; na przykład:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
źródło
4
Plus jeden za szczegółową odpowiedź, chociaż wolę splat niż to_a( [*'1'..'3']).
Michael Kohl,
@MichaelKohl Zgadzam się; Miałem (błędne) wrażenie, że w 1.8.6 nie da się rozbić zakresów. Dodam, dzięki! Zauważ, że nie musisz splatować wewnątrz literału tablicowego (chyba że tworzysz kompozycję razem z ikoną).
Phrogz,
Wiem, że po prostu do tego celu używam głównie splat (czyli komponowania) i podoba mi się też, że pokazuje, z czym skończysz.
Michael Kohl,
2
Można również użyć metody klasy Array :: []: Array[ "1","2","3"] #=> ["1","2","3"](nie sądzę, aby ta metoda miała cokolwiek wspólnego z konstruktorem literału tablicy). Możesz również użyć tablicy Kernel # najwyższego poziomu (nazwa metody wygląda jak nazwa klasy)Array(1..5) #=> [1,2,3,4,5]
b1_
co robi *? gdzie mogę znaleźć odpowiednią dokumentację?
Arnold Roa
22

Oneliner:

array = [] << 1 << 2 << 3   #this is for fixnums.

lub

 a = %w| 1 2 3 4 5 |

lub

 a = [*'1'..'3']

lub

 a = Array.new(3, '1')

lub

 a = Array[*'1'..'3']
pankajdoharey
źródło
8
Nie głosowałem w dół, ale zgaduję, ponieważ wywołało to trzy metody i przyrostowo powiększa tablicę, w przeciwieństwie do tej, [1,2,3]która wykonuje pojedynczą inicjalizację. Poza tym masz więcej postaci. Ponadto utworzyłeś tablicę liczb poprawek, podczas gdy OP pytał o tablicę ciągów.
Phrogz,
8

Wraz z powyższymi odpowiedziami możesz to zrobić

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
źródło
1
W 1.9 można również zrobić to w następujący sposób: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl,
7

Aby udowodnić, że jest więcej niż jeden sześć sposobów, aby to zrobić:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

Gdyby metoda 1.metoda (: +) nie była możliwa, można by to również zrobić

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

Jasne, w tym scenariuszu jest to przesada, ale jeśli plus_1było to naprawdę długie wyrażenie, możesz chcieć umieścić je w osobnym wierszu od tworzenia tablicy.

Andrew Grimm
źródło
3

Możesz to zrobić

array = ['1', '2', '3']

Jak zauważyli inni, możesz również zainicjować tablicę z notacją% w w następujący sposób:

array = %w(1 2 3)

lub

array = %w[1 2 3]

Należy pamiętać, że w obu przypadkach każdy element jest łańcuchem, a nie liczbą całkowitą. Więc jeśli chcesz mieć tablicę, której elementy są liczbami całkowitymi, nie powinieneś zawijać każdego elementu apostrofami:

array_of_integers = [1, 2, 3]

Nie musisz też umieszczać przecinka między elementami (co jest konieczne przy tworzeniu tablicy bez tej notacji% w). Jeśli to zrobisz (co często robiłem przez pomyłkę), na przykład:

wrong_array = %w(1, 2, 3)

jego elementami będą trzy ciągi ---- „1”, „2”, „3”. Więc jeśli to zrobisz:

puts wrong_array

wynik będzie następujący:

1,
2,
3
=>nil

czego tutaj nie chcemy.

Mam nadzieję, że to pomoże wyjaśnić sprawę!

Tajga
źródło
2

Aby utworzyć taką tablicę, możesz zrobić:

array = ['1', '2', '3']
Reese Moore
źródło
2

Jeśli masz tablicę ciągów, możesz ją również zainicjować w następujący sposób:

array = %w{1 2 3}

po prostu oddziel każdy element dowolną spacją

John Douthat
źródło
1

Możesz zainicjować tablicę w jednym kroku, pisząc elementy w []następujący sposób:

array = ['1', '2', '3']
sepp2k
źródło
0

Możesz to po prostu zrobić za pomocą %wnotacji w tablicach ruby.

array = %w(1 2 3)

Doda wartości tablicy 1, 2, 3 do tablicy i wydrukuje dane wyjściowe jako ["1", "2", "3"]

Prabhakar Undurthi
źródło