Stavo leggendo this question e mi ha fatto pensare perché si sarebbe voluto usare un ciclo while quando invece si poteva usare il metodo redo. Non riesco a trovare alcuna differenziazione tra i due. So che il metodo redo eseguirà nuovamente il blocco di codice e che mentre i loop eseguiranno nuovamente il blocco di codice finché il condizionale è vero. Qualcuno può dare un esempio del perché si vorrebbe usare l'uno o l'altro?Ruby's redo method vs while loop
risposta
Il comando redo
riavvia l'iterazione corrente di un loop (senza controllare condizioni di terminazione in while
o avanzare iteratori in for
, per esempio), è ancora necessario un ciclo di qualche descrizione (ad esempio un ciclo while
).
che è testimoniata dalla risposta si collega a, che contiene:
nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
print "What is #{num1} + #{num2}: "
redo unless gets.to_i == num1 + num2
end
Il .each
fornisce la struttura loop lì e tutto il redo
non fa altro che riavviare quel ciclo (senza avanzare alla prossima nums
elemento), se si ottenere la risposta sbagliata
Ora è possibile mettere in uso un ciclo while
lì come il loop di controllo, avanzando a quello successivo solo se si ottiene destra:
nums = Array.new(5){[rand(1..9), rand(1..9)]}
index = 0
while index < 6 do
num1 = nums[index][0]
num2 = nums[index][1]
print "What is #{num1} + #{num2}: "
if gets.to_i == num1 + num2 then
index = index + 1
end
end
o all'interno della .each
se stessa senza redo
:
nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
answer = num1 + num2 + 1
while answer != num1 + num2 do
print "What is #{num1} + #{num2}: "
answer = gets.to_i
end
end
ma nessuno di questi è elegante come la soluzione redo
, che fornisce un modo più espressivo per controllare i loop, un'estensione del solito controllo che si vede in altre lingue, come ad esempio continue
o break
.
- 1. Cursors vs. While loop - SQLServer
- 2. per loop vs while loop vs ciclo foreach PHP
- 3. Best asynchronous while method
- 4. Python while loop
- 5. Clojure While Loop
- 6. Pausa DO While Loop Java?
- 7. Nested WHILE loop in Python
- 8. mysql while loop Break equivalent
- 9. Do .. While loop in C#?
- 10. Exit while loop in Python
- 11. While Loop e condizioni multiple
- 12. Problemi di PHP while loop
- 13. Sentinel while loop per C++
- 14. mysqli_query, mysqli_fetch_array e while loop
- 15. Interruzione shell while-true loop
- 16. Big O per loop while
- 17. Come parallelizzare fare while e while loop in openmp?
- 18. While-loop con if-statement più veloce del ciclo while
- 19. Abort Rubys Shoes animation
- 20. "Do While" "Loop" e "While" "Wend" Loop. Qual è la differenza?
- 21. + = new EventHandler (Method) vs + = Metodo
- 22. Python - Threading e un loop True While
- 23. While Loop to Iterate through Database
- 24. Python While Loop, l'operatore e (&) non funziona
- 25. While loop senza uscita console di blocco
- 26. WHILE LOOP con IF STATEMENT MYSQL
- 27. PHP while loop trova l'ultima riga
- 28. Come saltare un'iterazione/loop in ciclo while
- 29. Do while loop with a cout statement
- 30. While-loop ignora scanf la seconda volta
Buona risposta. Sapete se 'redo' è ampiamente usato? Lo usi spesso? Non ne ho mai avuto la necessità, preferendo invece fare un ciclo con un enumeratore o un loop fino a quando non mi rendo fuori, ma sono solo un hobbista, quindi forse ho trascurato uno strumento utile. –
@Cary, non lo uso _that_ spesso ma l'ho usato, in un caso molto simile al codice fornito. Quando si esegue il iter su una raccolta in cui non si ha controllo tramite un indice, a volte è utile poter riavviare sull'elemento di raccolta corrente, se si verifica un problema temporaneo (come l'utente che inserisce dati errati). – paxdiablo
@paxdiablo, grazie mille per questa risposta chiara. – chell