2015-03-26 22 views
5

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

3

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.

+0

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

+0

@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

+0

@paxdiablo, grazie mille per questa risposta chiara. – chell