Przeglądam proste skrypty Ruby i ostatnio udało mi się natrafić na rzecz, której kompletnie nie rozumiem. Mianowicie w:
num1=num2=nil
puts “Podaj pierwsza liczbe:”
while num=gets.to_i
if num1.nil?
num1=num
num2=nil
puts “Podaj druga liczbe:”
elsif num2.nil?
num2=num
puts “Wynik: #{num1+num2}”
num1=nil
puts “Podaj pierwsza liczbe:”
end
end
intryguje mnie fragment: while num=gets.to_i, bo w moim myśleniu, po while zawsze powinno być sprawdzenie warunku, a tu jest przypisanie :o
Czy ktoś byłby uprzejmy mi wyjaśnić o co tu chodzi i jak to działa?
While przyjmuje dowolną wartość i sprawdza czy jest prawdą czy nie. Dlatego nie musi tam być żaden warunek w stricte tego słowa znaczeniu (jak np. “a > 2”).
(num = gets.to_i) zwraca pobrany ze standardowego wejścia znak przekształcony na integer przy okazji przypisując tą wartość do zmiennej num.
W ten sam sposób używa się czasami przypisania w ifie:
[code]if value = get_something
puts value
end
zamiast
value = get_something
if value
puts value
end[/code]
Tylko uważaj - ten program jest nieskończoną pętlą.
Metoda .to_i zawsze zwróci jakiś integer, w razie wątpliwości będzie to zero, a zero jest w rubim wartością prawdziwą.
Gdybyś kiedys chciał rzeczywiście stworzyć nieskończoną pętlę, użyj bardziej czytelnych konstrukcji:
loop do; zrob cos; end
albo while true; do end
Czytelność kodu jest bardzo ważna, a ten pokazany tu kawałek jest pułapką.