224 votes

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

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

Quand j'exécute le code dans irb je reçois l'avertissement suivant

  warning: default `to_a' will be obsolete
 

Quelle est la bonne alternative à l'utilisation de to_a?

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

400voto

Zamith Points 1637

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 le constructeur Array,

 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]
 

83voto

Daniel Lucraft Points 3323

Cela fonctionne pour moi en 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-t-il les parenthèses?

(J'utilise Ruby 1.8.6 patchlevel 114)

36voto

Richard Turner Points 3035

On dirait que vous faites ça:

 0..10.to_a
 

L'avertissement provient de Fixnum # to_a, pas de la plage # to_a. Essayez plutôt ceci:

 (0..10).to_a
 

10voto

Boris Stitnicky Points 5409

Vérifie ça:

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

5voto

J'ai juste essayé d'utiliser des quantités plus grandes ou 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 gammes.
J'ai donc dû utiliser l'option suivante:

 (1..5).to_a.reverse
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X