2012-04-08 6 views
5

El único caso de uso que se me ocurre para redo sería para operaciones como escribir en un socket o leer de una base de datos, pero si fallan una vez, los intentos posteriores también probablemente fallarán, así que aún me parece un tanto inútil en cuanto al retry no puedo pensar en ningún caso en el que sea útil.¿Cuál es el propósito de rehacer y volver a intentar declaraciones en Ruby?

Esto puede parecerme sin sentido, ya que no conozco ni uso Ruby, pero aspiro a crear un lenguaje increíble algún día, así que al menos me gustaría conocer el razonamiento detrás del diseño de algunos de los idiomas más populares. ahí.

+0

Su afirmación de que "los intentos posteriores lo más probable es también fallar" parece muy discutible. Me parece que esto sería muy dependiente de lo que falló y por qué. Por ejemplo, si el motivo por el cual el archivo de operación de la base de datos fue un punto muerto provocado por la consulta que estaba ejecutando otra persona, entonces es exactamente lo correcto hacer una copia de seguridad y volver a intentarlo. –

Respuesta

8

La idea es que cambie algo antes de llamar a redo o retry, con la esperanza de que lo que sea que esté haciendo funcione la segunda vez. No tengo un ejemplo para redo, pero hemos encontrado usos para retry en la aplicación en la que estoy trabajando. Básicamente, si tiene un poco de código que puede fallar debido a algo externo (por ejemplo, la red), pero realizar una comprobación previa de condición cada vez que ejecute el código sería demasiado caro, puede usar retry en un bloque begin...rescue. No estoy seguro si eso estaba claro, así que iré directamente al ejemplo.

Básicamente, tenemos un código que accede a un directorio remoto usando Net:SFTP. El directorio debería existir, pero en algunos casos excepcionales no se habrá realizado aún. Si no está allí, queremos probar una vez para hacerlo. Pero realizar el acceso a la red para comprobar si el directorio existe siempre sería demasiado costoso, especialmente porque solo en casos excepcionales no estará allí. Así lo hacemos de la siguiente manera:

tried_mkdir = false 
begin 
    # Attempt to access remote directory 
    ... 
rescue Net::SFTP::StatusException 
    raise if tried_mkdir 
    tried_mkdir = true 
    # Attempt to make the remote directory 
    ... 
    retry 
end 
6

Caso de uso para redo podría ser la comprobación de la entrada del usuario:

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 
Cuestiones relacionadas