Ruby语法:从'each ... do ..'块中突破

Mel*_*lon 48 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在开发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
Run Code Online (Sandbox Code Playgroud)

我想停止/从跳出each一次result真实的(这是打破eachif块car.name是一样的name参数一次),并返回car其导致真正的结果.如何在Ruby代码中突破?

tbu*_*ann 95

你可以打破break关键字.例如

[1,2,3].each do |i|
  puts i
  break
end
Run Code Online (Sandbox Code Playgroud)

将输出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
Run Code Online (Sandbox Code Playgroud)

虽然您也可以使用Array#detectArray#any?用于此目的.


tok*_*and 13

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

那么你需要的是:

def check(cars, car_name)
  cars.detect { |car| car.name == car_name }
end
Run Code Online (Sandbox Code Playgroud)

如果您只是想知道是否有任何带有该名称的汽车,那么您就可以使用了Enumerable#any?.根据经验,Enumerable#each仅用于做副作用,而不是执行逻辑.