Problem z przerwaniem zagnieżdżonej pętli

Mam następujący kod:

while true puts "a" while true puts "b" x = gets break if x == "1" end end
Więcej defakto nie jest potrzebne. Powyższy przykład oczywiście mogę zrealizować poprzez wstawienie warunku do while, ale nie chcę tego robić w ten sposób. Teraz mam problem, gdyż program nie chce wyjść z drugiej pętli, pomimo podania liczby 1 w gets. Wychodzenie z pętli głównej nie stanowi problemu, natomiast gorzej z wychodzeniem z pętli zagnieżdżonej. Jedyne co działa to return, ale return wychodzi z obu pętli, a ja chcę tylko z tej zagnieżdżonej… I winą nie jest sam warunek, tylko to nieszczęsne “break”.

[code]$ irb

gets
1
=> “1\n”

“1\n” == “1”
=> false[/code]
Myślę, że to powinno pomóc :wink:

I to: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp

UPDATE:

chomp, nie strip, miałem jakieś zamroczenie

Nie, gets.chomp też próbowałem. Mówię, że problem nie leży w warunku, bo sam warunek wydzieliłem i sprawdzałem i działa - jeśli zamiast break, dam np. "puts “ok” " to ok się pokazuje, ale jak już jest “break” to za chiny nie chce wyjść z pętli zagnieżdżonej. I dlatego też dałem “puts” na początku pętli nadrzędnej, żeby sprawdzić, czy może po wykonaniu instrukcji break wychodzi z pętli zagnieżdżonej i od nowa wykonuje pętlę nadrzędną. Ale tak nie jest.

while true puts "a" while true puts "b" x = gets.chomp break if x == "1" end end
Works on my machine. Break wychodzi z pętli „b”, wyświetla „a” i znowu wchodzi do pętli wewnętrznej.

Jak nie jest, jak jest. :wink: Uruchomiłem ten kod (dodałem .chomp), działa tak jak chcesz - po wpisaniu “1” wypisuje “a” i “b”.

Rozumiem, że jest to przykład jakiegoś rozwiązania, a nie rzeczywiście używany kod. W każdym razie, break rzeczywiście wyskakuje tylko z jednej pętli. Jeżeli chcesz wyskoczyć z dwóch, druga pętla też musi sprawdzić jakiś warunek. Ponieważ nie ma sensu przepisywać właściwego warunku dwa razy, pętla wewnętrzna może ustawić jakąś zmienną logiczną i wyskoczyć, a druga pętla też zawsze tę zmienną sprawdza i wyskakuje w razie czego.

Inne rozwiązania to:

  • użycie metody i return
  • użycie catch i throw

Jestem żałosny. Faktycznie, to nie tu leżał błąd, a leżał w tym, że w pętli nadrzędnej, za pętlą zagnieżdżoną miałem też warunek:

if x == 2

No właśnie. Liczba, a nie string. To dlatego nie działało (a raczej działało) x,x Ja jestem naprawdę czasem ślepy.

Eej, to nie fair! Jak miałeś, to dlaczego nie pokazałeś? Co, to jest - ludzie sobie głowy łamią, wymyślają co też tam mogło być pominięte, a potem się dowiadują, że “tak, było ale nie pokazałem”.

Wrrrr…

No patrz, ale szare komórki rozwijasz :smiley: Mam nawyk nie pokazywania swojego kodu w formie jakiej jest, bo już wiele razy miałem problem, że właśnie pisali z prośbą o przykład, bo z całego kodu czasem ciężko się odczytać :smiley: A byłem prawie pewien, że to winą jest break, więc zamieściłem tylko tą część kodu w formie przykładu :smiley:

Rotfl, to albo piszesz brajlem albo pytałeś na samosi. Jeszcze nigdy nie spotkałem się z postem typu “pokaż przykład bo tego nie rozumiem”.

Z drugiej strony faktycznie, gdybyś dopisał jeszcze tego 1 ifa ciężko by było analizować taki kod :rolleyes:

No nie obrażaj mnie, chodziło o problemy w dużo dużo bardziej rozbudowanych kodach i dlatego zawsze ludzie prosili o przykład… z tymże to ja byłem po stronie pomagającej zazwyczaj, acz to nie ja prosiłem o przykład. Oj, nieważne, na przyszłość będę wam wrzucał oryginały. Z drugiej strony dobrze, bo w ten sposób sam doszedłem do rozwiązania problemu :stuck_out_tongue: