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