Wie initialisiere ich ein Array in einem Schritt mit Ruby?

104

Ich initialisiere ein Array folgendermaßen:

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

Ist das in einem Schritt möglich? Wenn das so ist, wie?

user502052
quelle
20
+1 nur für neuartiges einzeiliges wiederholtes Drücken. :)
Phrogz
1
@Phrogz etwas kürzer : array = Array.new << 1 << 2 << 3 ;)
Alexander Suraphel
@AlexanderSuraphel Das erstellt ein Array von Fixnums anstelle eines Arrays von Strings.
Phrogz
1
@Phrogz Ich wollte nur erwähnen, dass es sogar kürzer sein kann. Sie müssen nur Änderungen 1zu '1'.
Alexander Suraphel

Antworten:

191

Sie können ein Array-Literal verwenden:

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

Sie können auch einen Bereich verwenden:

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

Für Arrays von durch Leerzeichen getrennten Zeichenfolgen können Sie die Percent String-Syntax verwenden :

array = %w[ 1 2 3 ]

Sie können auch einen Block übergeben, Array.newum den Wert für jeden Eintrag zu bestimmen:

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

Beachten Sie auch, dass Sie in Ruby 1.8.7+ Enumeratoren verwenden können, um Arrays zu erstellen, obwohl nicht das gleiche Array aus drei Zeichenfolgen wie in den anderen obigen Antworten erstellt wird. beispielsweise:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
quelle
4
Plus eins für die detaillierte Antwort, obwohl ich lieber splat als to_a( [*'1'..'3']).
Michael Kohl
@ MichaelKohl Ich stimme zu; Ich hatte den (irrtümlichen) Eindruck, dass man in 1.8.6 keine Bereiche aufteilen konnte. Ich werde das hinzufügen, danke! Beachten Sie, dass Sie nicht innerhalb eines Array-Literals splat müssen (es sei denn, Sie setzen zusammen mit dem splat zusammen).
Phrogz
Ich weiß, es ist nur so, dass ich meistens Splat für diesen Zweck benutze (Compositing also) und ich mag es auch, dass es zeigt, was Sie am Ende haben.
Michael Kohl
2
Außerdem kann die Klassenmethode Array :: [] verwendet werden: Array[ "1","2","3"] #=> ["1","2","3"](Ich glaube, diese Methode hat nichts mit dem Array-Literal-Konstruktor zu tun.) Sie können auch das Kernel # Array der obersten Ebene verwenden (Methodenname sieht aus wie ein Klassenname)Array(1..5) #=> [1,2,3,4,5]
b1_
Was macht der *? Wo finde ich Dokumentation dazu?
Arnold Roa
21

Einzeiler:

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

oder

 a = %w| 1 2 3 4 5 |

oder

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

oder

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

oder

 a = Array[*'1'..'3']
pankajdoharey
quelle
8
Ich habe es nicht abgelehnt, aber ich vermute, weil dies drei Methoden aufgerufen und das Array schrittweise vergrößert hat, im Gegensatz zu [1,2,3]einer einzelnen Initialisierung. Deiner ist mehr Charaktere. Außerdem haben Sie ein Array von Fixnums erstellt, während das OP nach einem Array von Zeichenfolgen gefragt hat.
Phrogz
8

Zusammen mit den obigen Antworten können Sie dies auch tun

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
quelle
1
In 1.9 können Sie dies auch folgendermaßen tun : >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl
7

Mehr als zu beweisen , gibt es One Six Ways To Do It:

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

Wenn 1.Methode (: +) nicht möglich wäre, könnten Sie dies auch tun

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

Sicher, es ist in diesem Szenario übertrieben, aber wenn plus_1es sich um einen wirklich langen Ausdruck handelt, möchten Sie ihn möglicherweise in eine separate Zeile von der Array-Erstellung einfügen.

Andrew Grimm
quelle
3

Du kannst tun

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

Wie andere angemerkt haben, können Sie ein Array auch mit der% w-Notation wie folgt initialisieren:

array = %w(1 2 3)

oder

array = %w[1 2 3]

Bitte beachten Sie, dass in beiden Fällen jedes Element eine Zeichenfolge und keine Ganzzahl ist. Wenn Sie also ein Array möchten, dessen Elemente Ganzzahlen sind, sollten Sie nicht jedes Element mit Apostrophen umschließen:

array_of_integers = [1, 2, 3]

Außerdem müssen Sie kein Komma zwischen die Elemente setzen (was erforderlich ist, wenn Sie ein Array ohne diese% w-Notation erstellen). Wenn Sie dies tun (was ich oft versehentlich getan habe), wie in:

wrong_array = %w(1, 2, 3)

seine Elemente werden drei Zeichenfolgen sein ---- "1", "2", "3". Wenn Sie dies tun:

puts wrong_array

Die Ausgabe lautet:

1,
2,
3
=>nil

Das ist nicht das, was wir hier wollen.

Hoffe das hilft den Punkt zu klären!

Taiga
quelle
2

So erstellen Sie ein solches Array:

array = ['1', '2', '3']
Reese Moore
quelle
2

Wenn Sie ein Array von Zeichenfolgen haben, können Sie es auch folgendermaßen initialisieren:

array = %w{1 2 3}

Trennen Sie einfach jedes Element mit einem Leerzeichen

John Douthat
quelle
1

Sie können ein Array in einem Schritt initialisieren, indem Sie die Elemente []wie folgt schreiben :

array = ['1', '2', '3']
sepp2k
quelle
0

Sie können dies einfach mit %wNotation in Ruby-Arrays tun .

array = %w(1 2 3)

Es werden die Array-Werte 1,2,3 zum Array hinzugefügt und die Ausgabe als gedruckt ["1", "2", "3"]

Prabhakar Undurthi
quelle