2011-12-14 2 views
36

私はRuby on Railsアプリを開発中です。私の質問はRubyの構文です。Rubyの構文: 'each .. do ..'ブロックから抜け出す

私はクラスメソッドself.checkとモデルクラスがあります。それがあればeachブロックを破るだ(私は一度resultあるeachブロックから抜け出す/停止したい

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 

car.namenameと同じです。の結果になるcarを返します。どのようにRubyコードで抜け出すのですか?

答えて

77

キーワード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?を使用することができますが。

1

あなたはbreakを使用することができますが、何あなたがやろうとしているが、このように、はるかに簡単に行うことができる:

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

これは、データベースを使用しています。 Rubyをデータベースでよりうまく処理できる場所でRubyを使用しようとしています。

また、条件付きbreakを使用することができます。

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

私は悪いサンプルコードを提供します。私はデータベースから何かを直接見つけたり、チェックしたりしていません。私はちょうどいくつかの条件が一度満たされ、真の結果を引き起こす '車'を返すならば、 "各"ブロックから脱出する方法が必要です。 – Mellon

+3

さて、これを改善することもできます: 'def self.check(name); self.where(:name => name).any ?;最後 ' –

+0

最初のスニペットは '!! self.find_by_name(name)'と書くことができます。 – tokland

10

私が悪いのサンプルコードを提供しています。私は直接データベースから を見つけたり、調べたりしていません。 いくつかの条件が一度満たされ、trueを引き起こす '車'を返した場合、それぞれのブロックから抜け出す方法が必要です。 結果

次に何が必要です:

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

あなたはどんな車がその名前であった場合だけ知りたいと思ったなら、あなたはEnumerable#any?を使用すると思います。経験則として、副作用を行う場合にのみEnumerable#eachを使用し、論理を実行しないでください。

+1

私は10kまであなたをプッシュする名誉を持っていた!おめでとう。 –

+0

@マーク:ありがとう!あなたは自分自身の半分以上、幸運です。 – tokland

1

include?メソッドを使用できます。

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

include?戻りtruename場合は、それがfalse返す他cars配列中に存在しています。

関連する問題