unless - loop until ruby
Regla de Rubocop: nunca use ''do'' con multilĂnea ''mientras (2)
Tengo el siguiente código
# colours a random cell with a correct colour
def colour_random!
while true do
col, row = rand(columns), rand(rows)
cell = self[row,col]
if cell.empty? then
cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
break
end
end
end
no es tan importante lo que está haciendo, aunque debería ser bastante obvio. El punto es que Rubocop me da una advertencia
Nunca use ''do'' con multi-line ''mientras
¿Por qué no debería hacer eso? ¿Cómo debería hacerlo entonces?
Ruby en realidad tiene un atajo para while true
: la declaración de loop
.
def colour_random!
loop do
col, row = rand(columns), rand(rows)
cell = self[row,col]
if cell.empty? then
cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
break
end
end
end
while
es una palabra clave, por lo que no necesita pasar un bloque. Sin do..end
... final, funcionará bien. El siguiente está bien
def colour_random!
while true
col, row = rand(columns), rand(rows)
cell = self[row,col]
if cell.empty? then
cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
break
end
end
end
while
es una palabra clave, y si le pasa un bloque, como do..end
, aún funciona como usted lo pidió, al no arrojar ningún error, sino solo una advertencia . Pero podría ser peligroso si intentas pasarle un objeto Proc
o Method
, y dinámicamente intenta convertirlo a un bloque usando &
keyword, como hacemos generalmente. Eso significa
# below code will work as expected just throwing an warning.
x = 2
while x < 2 do
#code
end
Pero si intentas hacerlo por error, como a continuación
while &block # booom!! error
La razón es while
es una palabra clave, que no admite ningún método to_proc
para satisfacer su necesidad. Entonces puede ser peligroso .
La guía de estilo Ruby también sugirió que nunca use while/until condition do
para multilíneas while/until
Creo que la razón es como dijo Nobuyoshi Nakada en la lista de correo
loop
es un método kernel
que toma un bloque . Un bloque introduce un nuevo ámbito de variable local .
loop do
a = 1
break
end
p a #=> causes NameError
while
que no.
while 1
a = 1
break
end
p a #=> 1