Comment initialiser un tableau en une seule étape avec Ruby?

105

J'initialise un tableau de cette façon:

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

Est-il possible de faire cela en une seule étape? Si c'est le cas, comment?

user502052
la source
20
+1 juste pour une nouvelle poussée répétée sur une seule ligne. :)
Phrogz
1
@Phrogz légèrement plus court:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel
@AlexanderSuraphel Cela crée un tableau de Fixnums au lieu d'un tableau de chaînes.
Phrogz
1
@Phrogz je voulais juste mentionner que cela peut même être plus court. Vous devez juste changer 1pour '1'.
Alexander Suraphel

Réponses:

192

Vous pouvez utiliser un littéral de tableau:

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

Vous pouvez également utiliser une plage:

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

Pour les tableaux de chaînes délimitées par des espaces, vous pouvez utiliser la syntaxe de chaîne de pourcentage :

array = %w[ 1 2 3 ]

Vous pouvez également passer un bloc à Array.newpour déterminer la valeur de chaque entrée:

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

Enfin, bien qu'il ne produise pas le même tableau de trois chaînes que les autres réponses ci-dessus, notez également que vous pouvez utiliser des énumérateurs dans Ruby 1.8.7+ pour créer des tableaux; par exemple:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
la source
4
Plus un pour la réponse détaillée, même si je préfère splat à to_a( [*'1'..'3']).
Michael Kohl
@MichaelKohl Je suis d'accord; J'avais l'impression (erronée) que vous ne pouviez pas splater les plages en 1.8.6. J'ajouterai ça, merci! Notez que vous n'avez pas besoin de splat dans un littéral de tableau (sauf si vous composez avec le splat).
Phrogz
Je sais, c'est juste que j'utilise principalement splat à cette fin (c'est-à-dire la composition) et j'aime aussi que cela montre ce que vous obtenez.
Michael Kohl
2
De plus, la méthode de classe Array :: [] peut être utilisée: Array[ "1","2","3"] #=> ["1","2","3"](je ne pense pas que cette méthode ait quoi que ce soit à voir avec le constructeur littéral de tableau). Vous pouvez également utiliser le Kernel # Array de niveau supérieur (le nom de la méthode ressemble à un nom de classe)Array(1..5) #=> [1,2,3,4,5]
b1_
que fait le *? où puis-je trouver de la documentation pour cela?
Arnold Roa
22

Bon mot:

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

ou

 a = %w| 1 2 3 4 5 |

ou

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

ou

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

ou

 a = Array[*'1'..'3']
pankajdoharey
la source
8
Je n'ai pas voté contre, mais je suppose que cela a invoqué trois méthodes et augmente progressivement le tableau, par opposition à [1,2,3]une seule initialisation. En outre, le vôtre est plus de personnages. De plus, vous avez créé un tableau de Fixnums alors que l'OP demandait un tableau de chaînes.
Phrogz
8

En plus des réponses ci-dessus, vous pouvez également le faire

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
la source
1
En 1.9 , vous pouvez aussi le faire de cette façon: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl
7

Pour prouver qu'il ya plus d' un Six façons de le faire:

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

Si 1.method (: +) n'était pas possible, vous pouvez également faire

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

Bien sûr, c'est exagéré dans ce scénario, mais s'il plus_1s'agissait d'une expression vraiment longue, vous voudrez peut-être la mettre sur une ligne distincte de la création du tableau.

Andrew Grimm
la source
3

Tu peux faire

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

Comme d'autres l'ont noté, vous pouvez également initialiser un tableau avec la notation% w comme ceci:

array = %w(1 2 3)

ou

array = %w[1 2 3]

Veuillez noter que dans les deux cas, chaque élément est une chaîne plutôt qu'un entier. Donc, si vous voulez un tableau dont les éléments sont des entiers, vous ne devez pas envelopper chaque élément avec des apostrophes:

array_of_integers = [1, 2, 3]

De plus, vous n'avez pas besoin de mettre une virgule entre les éléments (ce qui est nécessaire lors de la création d'un tableau sans cette notation% w). Si vous faites cela (ce que j'ai souvent fait par erreur), comme dans:

wrong_array = %w(1, 2, 3)

ses éléments seront trois chaînes ---- "1,", "2,", "3". Donc si vous faites:

puts wrong_array

la sortie sera:

1,
2,
3
=>nil

ce n'est pas ce que nous voulons ici.

J'espère que cela aidera à clarifier le point!

Taïga
la source
2

Pour créer un tel tableau, vous pouvez faire:

array = ['1', '2', '3']
Reese Moore
la source
2

Si vous avez un tableau de chaînes, vous pouvez également l'initialiser comme ceci:

array = %w{1 2 3}

séparez simplement chaque élément avec n'importe quel espace

John Douthat
la source
1

Vous pouvez initialiser un tableau en une seule étape en écrivant les éléments []comme ceci:

array = ['1', '2', '3']
sepp2k
la source
0

Vous pouvez simplement le faire avec la %wnotation dans les tableaux ruby.

array = %w(1 2 3)

Il ajoutera les valeurs du tableau 1, 2, 3 au tableau et affichera la sortie comme ["1", "2", "3"]

Prabhakar Undurthi
la source