2008-10-10 6 views
154

pracuję poprzez książki, która daje przykłady zakresy są konwertowane na równoważne tablic używając ich „to_a” metodpoprawny sposób wypełnić tablicę z zasięgiem w Ruby

Kiedy uruchomić kod w IRB otrzymuję następujące ostrzeżenie

warning: default `to_a' will be obsolete 

Jaka jest prawidłowa alternatywa do korzystania to_a?

Czy istnieją alternatywne sposoby wypełnienia tablicy zakresem?

+6

Duże zastrzeżenie do zamiany zakresu na tablicę, i s duży zakres może zużywać dużo pamięci, gdy macierz jest zbudowany, więc używaj go ostrożnie. Zamiast tworzyć tablicę, lepiej byłoby powtórzyć zakres, tak jak tablicę, aby zmniejszyć zużycie pamięci. Jest to jedna z tych "stosuj się w razie potrzeby". –

Odpowiedz

290

Można utworzyć tablicę z zakresu korzystania ikona,

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

użyciu KernelArray metodę

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

lub używając to_a

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

Co jeśli tablica jest już utworzona i chcesz dodać do niej zakres: Mam 'order = 1'. Następnie 'order << (2.25) .to_a'. Ale to tworzy kolejną tablicę wewnątrz tablicy, po prostu chcę mieć zakres od 2 do 25. Jednak jeśli spróbuję 'order << (2.25)' otrzymuję błąd nie mogę przekonwertować Range na Integer. – kakubei

+1

@kakubei użyj 'concat' zamiast' << '. Poza tym nie powinieneś dostawać "nie można konwertować zakresu na liczbę całkowitą", chyba że 'order' jest liczbą całkowitą - w takim przypadku byłbyś nieco przesunięty, a nie dodawany do tablicy. – Kelvin

+2

Opcja Splat nie działa dla Ruby 1.8.7, polecam użycie '(1..10) .to_a' dla kompatybilności wstecznej – halfcube

75

To działa na mnie w IRB:

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

Zauważyłem, że:

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

Więc może brakuje nawiasów?

(używam Ruby 1.8.6 patchlevel 114)

+6

** Wyjaśnienie **: bez nawiasów wywołujemy metodę to_a z instancji klasy Fixnum (w tym przypadku 4), a nie z zakresu 1..4. Jeśli uruchomisz 'Fixnum.methods.include? (To_a)' w Ruby 1.9.2 zauważysz, że metoda to_a nie jest już zdefiniowana, stąd dlaczego otrzymujesz tę wiadomość o amortyzacji w 08 – Pierre

+0

@Pierre Myślę, że chodziło o 'Fixnum.instance_methods.include? (: To_a)' – Kelvin

+0

@Kelvin - Właściwie, ' methods.include? 'jest bardziej pouczające: ' $ irb' 'irb (main): 001: 0> Fixnum.methods.include? (to_a)' '(irb): 1: warning: domyślne' to_a ' być przestarzałe '=> false' ' irb (main): 002: 0> Fixnum.instance_methods.include? (: to_a) ' ' => false' –

33

Brzmi jak robisz to:

0..10.to_a 

Ostrzeżenie jest od Fixnum # to_a, a nie z klasy # to_a. Spróbuj to zamiast:

(0..10).to_a 
3

Ja tylko starałem się używać zakresów z większych na mniejsze kwoty i dostałem wynik nie oczekiwać:

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

to dlatego zakresów wdrożeń.
więc musiałem użyć następującej opcji:

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

Dziś odkryłem '5.downto (1) .to_a', który jest innym sposobem wyrażania malejącego zakresu https://stackoverflow.com/a/8927009/703903 – odlp

6

Zaznacz to:

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

* 10.downto (1) było tym, na co patrzyłem za, dziękuję! – Daniel

0

Jest to kolejny sposób:

IRB> [* 1..10]

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

Powiązane problemy