web-dev-qa-db-fra.com

Manière correcte de remplir un tableau avec une plage Ruby

Je travaille sur un livre qui donne des exemples de plages converties en tableaux équivalents en utilisant leurs méthodes "to_a"

Quand j'exécute le code dans irb j'obtiens l'avertissement suivant

 warning: default `to_a' will be obsolete

Quelle est l'alternative correcte à l'utilisation de to_a?

existe-t-il d'autres moyens de renseigner un tableau avec une plage?

186
Willbill

Vous pouvez créer un tableau avec une plage en utilisant splat,

>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

en utilisant la méthode KernelArray,

Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ou en utilisant to_a

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
332
Zamith

Cela fonctionne pour moi dans irb:

irb> (1..4).to_a
=> [1, 2, 3, 4]

Je remarque que:

irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
        from (irb):1

Alors peut-être vous manque les parenthèses?

(Je cours Ruby 1.8.6 patchlevel 114)

78
Daniel Lucraft

On dirait que tu fais ça:

0..10.to_a

L'avertissement provient de Fixnum # to_a, pas de la plage # to_a. Essayez ceci à la place:

(0..10).to_a
34
Richard Turner

Vérifie ça:

a = [*(1..10), :top, *10.downto( 1 )]
8
Boris Stitnicky

J'ai juste essayé d'utiliser des gammes allant de plus en plus petites et j'ai obtenu le résultat auquel je ne m'attendais pas:

irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []

C'est à cause des implémentations de plages.
J'ai donc dû utiliser l'option suivante:

(1..5).to_a.reverse
3

C'est une autre façon:

irb> [* 1..10]

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]