2010-04-06 8 views
15

jak teno zakresie ruby?

range = (0..10) 

jak mogę dostać numer tak:

0 5 10 

oraz pięć za każdym razem, ale mniej niż 10

jeśli zakres = (0..20) następnie Powinienem uzyskać to:

0 5 10 15 20 

Odpowiedz

2

Metoda step opisana w http://ruby-doc.org/core/classes/Range.html powinien wykonać zadanie, ale poważnie szkodzimoże zaszkodzić czytelności.

Wystarczy rozważyć:

(0..20).step(5){|n| print ' first ', n }.each{|n| print ' second ',n } 

Możesz myśleć, że etap (5) rodzaj produkuje nowy asortyment, jak why_ „s pytanie początkowo przeznaczony. Ale każdy jest wywoływany na (0..20) i musi zostać zastąpiony innym krokiem (5), jeśli chcesz "ponownie użyć" zakresu 0-5-10-15-20.

Może będzie ci dobrze z czymś takim jak (0..3).map{|i| i*5}?

Ale "utrzymujących" wyników metody krokowego z.to_apowinny również działać grzywny.

+0

"poważnie szkodzi czytelności" - * co * ?! Czemu? W jaki sposób? –

+3

Twierdzę, że krok jest bardziej czytelny niż mapa tego rodzaju, przynajmniej w tym przypadku. – Amber

+0

'(0..20) .step (5) .each {...}. Każdy {...}' zrobi to, co chcesz. –

25

Spróbuj użyć .step(), aby przejść przez dany krok.

(0..20).step(5) do |n| 
    print n,' ' 
end 

daje ...

0 5 10 15 20 

Jak wspomniano przez dominikh można dodać .to_a na końcu dostać magazynować formę listy numerów: (0..20).step(5).to_a

+3

i jeśli chcesz zapisać liczby, których możesz użyć (0..10) .step (5) .to_a - wymaga to ruby> = 1.8.7. Alternatywą jest 0.step (10, 5) .to_a, co również wymagało ruby> = 1.8.7 –

4

Jak Dav powiedział: ale dodaj do:

(0..20).step(5).to_a # [0, 5, 10, 15, 20] 
+0

Zwykle nie musisz dodawać 'to_a', chyba że naprawdę * potrzebujesz * tablicy. –

Powiązane problemy