2008-10-10 6 views
154

Je travaille dans un livre qui donne des exemples de plages étant converties en tableaux équivalents en utilisant leurs méthodes « to_a »manière correcte de remplir un tableau avec une plage de Ruby

Quand je lance le code dans irb je reçois le avertissement suivant

warning: default `to_a' will be obsolete 

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

Existe-t-il d'autres façons de remplir un tableau avec une plage?

+6

La grande mise en garde à la conversion d'une gamme à un tableau, i s une grande plage peut consommer beaucoup de mémoire lorsque la matrice est construite, donc utilisez-la avec précaution. Au lieu de créer le tableau, il peut être préférable de parcourir la plage comme vous le feriez avec un tableau pour réduire la consommation de mémoire. C'est l'une de ces choses qui s'appliquent le cas échéant. –

Répondre

290

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

>> 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] 
+1

Que faire si le tableau est déjà créé et que vous voulez y ajouter une plage: J'ai order = 1'. Alors 'order << (2.25) .to_a'. Mais cela crée un autre tableau dans le tableau, je veux simplement la gamme de 2 à 25. Pourtant, si j'essaie 'order << (2.25)' je reçois l'erreur ne peut pas convertir Range en Integer. – kakubei

+1

@kakubei utilise 'concat' au lieu de' << '. En outre, vous ne devriez pas avoir "ne peut pas convertir Range en Integer" à moins que 'order' ne soit un entier - auquel cas vous seriez en train de changer de bit, et non en ajoutant un tableau. – Kelvin

+2

l'option Splat ne fonctionne pas pour Ruby 1.8.7, je recommanderais d'utiliser '(1..10) .to_a' pour la rétrocompatibilité – halfcube

75

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 suis en cours d'exécution Ruby 1.8.6 patchlevel 114)

+6

** Explication **: sans la parenthèse, vous appelez la méthode to_a à partir d'une instance de la classe Fixnum (dans ce cas 4), pas sur la plage 1..4. Si vous exécutez 'Fixnum.methods.include? (To_a)' dans ruby ​​1.9.2 vous remarquerez que la méthode to_a n'est plus définie, par conséquent pourquoi vous receviez ce message de dépréciation dans 08 – Pierre

+0

@Pierre Je pense que vous vouliez dire 'Fixnum.instance_methods.include? (: To_a)' – Kelvin

+0

@Kelvin - En fait, ' methods.include? 'est plus informatif: ' $ irb' 'irb (principal): 001: 0> Fixnum.methods.include? (to_a)' '(irb): 1: avertissement: par défaut' to_a ' être obsolète '=> false' ' irb (principal): 002: 0> Fixnum.instance_methods.include? (: to_a) ' ' => false' –

33

Sons comme vous faites ceci:

0..10.to_a 

L'avertissement est de Fixnum # to_a, pas de plage # to_a. Essayez ceci:

(0..10).to_a 
3

Je viens d'essayer d'utiliser va de plus à plus petite quantité et a obtenu le résultat que je ne m'y attendais pas:

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

C'est en raison des mises en œuvre de gammes.
donc je devais utiliser l'option suivante:

(1..5).to_a.reverse 
+2

Aujourd'hui, j'ai découvert '5.downto (1) .to_a' qui est une autre façon d'exprimer une diminution de la portée https://stackoverflow.com/a/8927009/703903 – odlp

6

Vérifiez ceci:

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

Le * 10.downto (1) était ce que je cherchais pour, merci! – Daniel

0

Ceci est une autre façon:

irb> [* 1..10]

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

Questions connexes