Ruby语法:从“each .. do ..”块中分离出来

我正在开发一个Ruby on Rails应用程序。 我的问题是关于Ruby语法的更多信息。

我有一个类方法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 

一旦 result (如果car.namename参数相同,则打破each块),然后返回导致真实结果的car 。 如何打破Ruby代码?

你可以用break关键字来打破。 例如

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

将输出1 。 或者如果你想直接返回值,请使用return

既然你更新了这个问题,这里的代码是:

 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 

虽然你也可以使用Array#detectArray#any? 为了这个目的。

我提供了一个不好的示例代码。 我不是直接从数据库中查找或检查某些东西。 我只需要一个方法,从“每个”块突破,如果遇到一个条件,并返回导致真正结果的“汽车”。

那么你需要的是:

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

如果你想知道是否有这个名字的汽车,那么你会用cars.any? 。 根据经验,不要使用Enumerable#each ,它的主要用途是做某种副作用(例如写入屏幕或文件),而不是执行纯逻辑。

你可以使用include? 方法。

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

include? 如果name存在于cars数组中,则返回false否则返回false

你可以使用break但是你想做的事情可以做得更容易,就像这样:

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

这使用数据库。 您正试图在数据库可以更好地处理它的地方使用Ruby。

你也可以使用break条件:

 break if (car.name == name)