while until unless true statement loop for example ruby while-loop rubocop

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