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.name
与name
参数相同,则打破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#detect
或Array#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)