2011-12-14 20 views
36

Estoy desarrollando una aplicación Ruby on Rails. Mi pregunta es más acerca de Ruby sintaxis.Sintaxis de Ruby: salir del bloque 'each .. do ..'

que tienen una clase de 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 del bloque each vez la result es cierto (eso es romper el bloque each si car.name es el mismo que el name parámetro una vez) y devolver el car que causan que la cierto resultado. ¿Cómo salir en el código de Ruby?

Respuesta

77

Puede romper con la palabra clave break. Por ejemplo

[1,2,3].each do |i| 
    puts i 
    break 
end 

dará salida a 1. O si desea devolver el valor directamente, use return.

Desde informado la cuestión, 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 se puede utilizar o Array#detectArray#any? para ese propósito.

1

Puede utilizar break pero lo que su están tratando de hacer que se podría hacer mucho más fácil, así:

def self.check(name) 
    return false if self.find_by_name(name).nil? 
    return true 
end 

Este utiliza la base de datos. Está intentando usar Ruby en un lugar donde la base de datos puede manejarlo mejor.

También puede utilizar break condicional:

break if (car.name == name) 
+0

Proporciono un código de muestra incorrecto. 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. – Mellon

+3

Bueno, incluso puedes mejorar esto: 'def self.check (name); self.where (: nombre => nombre) .any ?; end' –

+0

el primer fragmento se puede escribir: '!! self.find_by_name (name)'. – tokland

10

que proporcionan un código de ejemplo malo. No encuentro directamente ni compruebo 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 'auto' que causa el resultado verdadero .

Entonces lo que necesita es:

def check(cars, car_name) 
    cars.detect { |car| car.name == car_name } 
end 

Si quería sólo para saber si había cualquier coche con ese nombre, entonces tendrá que utilizar Enumerable#any?. Como regla general, use Enumerable#each solo para hacer efectos secundarios, no para realizar la lógica.

+1

¡Tuve el honor de extenderte hasta 10k! Felicitaciones –

+0

@Mark: ¡muchas gracias! Estás a más de la mitad del camino, buena suerte. – tokland

1

puede usar el método include?.

def self.check(name) 
    cars.include? name 
end 

include? rendimientos true si name está presente en la matriz cars si no devuelve false.

Cuestiones relacionadas