ruby on rails - tutorial - Sintaxis de Ruby: salir del bloque ''each.. do..''
ruby web (4)
Estoy desarrollando una aplicación Ruby on Rails . Mi pregunta es más sobre la sintaxis de Ruby .
Tengo una clase modelo con un método de clase self.check
:
class Cars < ActiveRecord::Base
...
def self.check(name)
self.all.each do |car|
#if result is true, break out from the each block, and return the car how to...
result = SOME_CONDITION_MEET?(car) #not related with database
end
puts "outside the each block."
end
end
Me gustaría parar / salir de each
bloque una vez que el result
sea verdadero (eso es romper each
bloque si car.name
es igual al parámetro del name
una vez ) Y devolver el car
que causa el verdadero resultado. ¿Cómo salir en el código de Ruby?
Proporciono un código de muestra malo. No encuentro directamente ni verifico algo de la base de datos. Solo necesito una forma de salir del bloque "cada" si alguna condición se encuentra una vez y devolver ese ''carro'' que causa el verdadero resultado.
Entonces lo que necesitas es:
def check(cars, car_name)
cars.detect { |car| car.name == car_name }
end
Si solo quisieras saber si había algún auto con ese nombre, entonces Enumerable#any?
. Como regla general, use Enumerable#each
solo para hacer efectos secundarios, no realizar lógica.
Puede romper con la palabra clave break
. Por ejemplo
[1,2,3].each do |i|
puts i
break
end
saldrá 1
. O si quiere devolver el valor directamente, use return
.
Como actualizaste la pregunta, aquí el código:
class Car < ActiveRecord::Base
# …
def self.check(name)
self.all.each do |car|
return car if some_condition_met?(car)
end
puts "outside the each block."
end
end
Aunque también puedes usar Array#detect
o Array#any?
para ese propósito.
Puede utilizar el break
pero lo que está tratando de hacer podría hacerse mucho más fácil, como este:
def self.check(name)
return false if self.find_by_name(name).nil?
return true
end
Esto usa la base de datos. Está intentando usar Ruby en un lugar donde la base de datos puede manejarlo mejor.
También puede usar break
conditional:
break if (car.name == name)
puedes usar include?
método.
def self.check(name)
cars.include? name
end
include?
devuelve true
si el name
está presente en la matriz cars
o devuelve false
.