Estoy usando este código para permitir que el usuario ingrese nombres mientras el programa los almacena en una matriz hasta que ingresen una cadena vacía (deben presionar enter después de cada nombre):
people = []
info = 'a' # must fill variable with something, otherwise loop won't execute
while not info.empty?
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end
Este código se vería mucho mejor en un bucle do ... while:
people = []
do
info = gets.chomp
people += [Person.new(info)] if not info.empty?
while not info.empty?
En este código no tengo que asignar información a alguna cadena aleatoria.
Lamentablemente, este tipo de bucle no parece existir en Ruby. ¿Alguien puede sugerir una mejor manera de hacer esto?
loop do; ...; break if ...; end
?Respuestas:
PRECAUCION :
El
begin <code> end while <condition>
es rechazado por el autor de Ruby, Matz. En cambio, sugiere usarKernel#loop
, por ejemploAquí hay un intercambio de correo electrónico el 23 de noviembre de 2005 donde Matz dice:
El wiki de RosettaCode tiene una historia similar:
fuente
begin end while
método no parecía correcto. Gracias por darme el forraje que necesitaba para convencer al resto del equipo.Originalmente escrito por Jeremy Voorhis . El contenido se ha copiado aquí porque parece haber sido retirado del sitio de origen. También se pueden encontrar copias en el Archivo Web y en el Foro Ruby Buzz . -Bill the Lizard
fuente
begin .. end
está algo mal visto. Usar en suloop do .. break if <condition>
lugar.Me gusta esto:
Referencia: Ruby's Hidden do {} while () Loop
fuente
until info.empty?
lugar dewhile not info.empty?
.¿Qué tal esto?
fuente
Aquí está el artículo de texto completo del enlace muerto de hubbardr a mi blog.
Encontré el siguiente fragmento mientras leía la fuente
Tempfile#initialize
en la biblioteca principal de Ruby:A primera vista, supuse que el
while
modificador se evaluaría antes que el contenido debegin...end
, pero ese no es el caso. Observar:Como era de esperar, el bucle continuará ejecutándose mientras el modificador sea verdadero.
Si bien estaría feliz de no volver a ver este idioma,
begin...end
es bastante poderoso. El siguiente es un idioma común para memorizar un método de una línea sin parámetros:Aquí hay una forma fea pero rápida de memorizar algo más complejo:
fuente
Esto funciona correctamente ahora:
Pero, puede eliminarse en el futuro, porque la
begin
declaración es contradictoria. Ver: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745Matz (el creador de Ruby) recomendó hacerlo de esta manera:
fuente
Por lo que deduzco, a Matz no le gusta la construcción
porque su semántica es diferente a
en que la primera construcción ejecuta el código primero antes de verificar la condición, y la segunda construcción prueba la condición primero antes de ejecutar el código (si alguna vez). Supongo que Matz prefiere mantener la segunda construcción porque coincide con una construcción de línea de sentencias if.
Nunca me gustó la segunda construcción, incluso para las declaraciones if. En todos los demás casos, la computadora ejecuta el código de izquierda a derecha (p. Ej. || y &&) de arriba a abajo. Los humanos leen el código de izquierda a derecha de arriba a abajo.
Sugiero las siguientes construcciones en su lugar:
No sé si esas sugerencias se analizarán con el resto del lenguaje. Pero en cualquier caso prefiero mantener la ejecución de izquierda a derecha, así como la coherencia del lenguaje.
fuente
fuente
while true
puede ser reemplazado porloop do
.while true
puede ser reemplazado conloop do
. Pero probé ambas construcciones con muchas iteraciones dentro del bucle y descubrí quewhile true
es al menos 2 veces más rápido queloop do
. No puedo explicar la diferencia, pero definitivamente está ahí. (Descubierto al probar Advent of Code 2017, día 15.)Aqui hay otro más:
fuente
unless
está justo al principio y no leo un montón de código (que podría ser más de lo que se muestra aquí) solo para encontrar un 'colgante'unless
al final. Es un principio general en el código que el modificador y las condiciones son más fáciles de usar cuando están 'por adelantado' como este.fuente