with tutorial rails que programacion lenguaje kids funciones ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

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 .