While z przypisaniem zamiast sprawdzenia warunku

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?

w rubim wszystko poza NIL i FALSE jest rozważane jako true

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]

dziękuję :slight_smile:

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ą.