Ruby语法:从'each ... do ..'块中突破
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
一旦each
为真,我想停止/突破result
区块(如果each
与car.name
参数相同,则打破name
区块)并返回导致真实结果的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, car_name)
cars.detect { |car| car.name == car_name }
end
如果您只是想知道是否有任何带有该名称的汽车,那么您将使用Enumerable#any?
。根据经验,只使用Enumerable#each
来做副作用,而不是执行逻辑。
另一答案
你可以使用include?
方法。
def self.check(name)
cars.include? name
end
如果include?
存在于true
数组中,name
将返回cars
,否则它将返回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)
以上是关于Ruby语法:从'each ... do ..'块中突破的主要内容,如果未能解决你的问题,请参考以下文章