2011-06-01 10 views

Odpowiedz

6

if oświadczenie prawdopodobnie byłby bardziej odpowiedni dla Twojego kodu, ponieważ nie masz ostateczne Zakres/wartość, ale raczej po prostu większe niż:

if ARGV.length == 0 
    abort "Error 1" 
elsif ARGV.length > 2 
    abort "Error 2" 
end 
15

Cóż, to nie działa, ponieważ nie jest poprawna składnia ruby. Jednak można to zrobić:

x = 15 
case x 
    when 0..9 then puts "good" 
    when 10..12 then puts "better" 
    when 13..200 then puts "best" 
    else 
    puts "either great or poor" 
end 
+3

Jak mogę poprawić mój konkretny kod? Dzięki. – emurad

+0

Twoja jest jedyną odpowiedzią, która ma dla mnie sens - prawdziwie idiomatyczną i elegancką. Właśnie to wykorzystałem. –

35

To nie jest poprawna składnia ruby.

Co trzeba to

case 
    when ARGV.length == 0 
    abort "Error 1" 
    when ARGV.length > 2 
    abort "Error 2" 
end 

Kiedy piszesz case x, ważną część trzeba zrozumieć, że rubin bierze X, a następnie stosuje się porównanie do argumentu lub wyrażenia włożeniu w klauzuli when.

Linia gdzie mówisz when x >2 czyta rubin jak:

if ARGV.length == > 2 

Po usunięciu konkretnego obiektu ze sprawozdania case można zastosować warunkowe terminie sprawozdania when.

+1

Ruby 1.8.7 + irb 0.9.5 raporty (irb): 4: błąd składniowy, nieoczekiwane ">" z oryginalnym zestawem instrukcji OP. Moja odpowiedź zawiera działający przepisany zestaw instrukcji. –

+0

Próbowałem go w pliku .rb, to pokazuje błąd składni następnie. * & ^^% &^IRB. – Zabba

+0

W tym miejscu irytujące jest to, że nie mogę znaleźć ostatecznej dokumentacji potwierdzającej moje twierdzenie. Po prostu wiem, * odpowiedź *. rubyspec.org i ruby-doc.org nie są pomocne. Specyfikacje składni języka, które mogę znaleźć, nie wydają się obejmować tego przypadku. –

19

Zastosowanie 1.0/0.0 dostać się do nieskończoności, który naprawia kod @ Mosch za:

case ARGV.length 
    when 0 
    raise "Too few" 
    when 3..(1.0/0.0) 
    raise "Too many" 
end 

Nie trzeba być Chuck Norris podzielić przez pływającym punktem zerowym.

+9

Zamiast '(1.0/0.0)' możemy użyć 'Float :: INFINITY', który został dodany w rubin 1.9.3. –