2009-07-23 3 views
12

行うRubyでは、ループ間の違いは何である(初心者の質問には申し訳ありませんが。):ルビー:@ cars.each do | car |の違いそして@carsで車を

@cars.each do |car| 

for car in @cars do 

効率に違いがありますか、同じものを表現するのに2つ(またはそれ以上)の方法が必要なのはなぜですか? 2番目の方法は私にとってよりエレガントな/自然なようですが、私はいくつかの重要な観察を逃しているかもしれません、なぜ最初の方が良い選択かもしれません。

答えて

20

より多くの人々が@cars.each表記法を使用します。

/forは、主に文法上の砂糖で、#eachです。 2つの作品は、変数のスコープであるかの主な違い:#eachはそうではない

irb> @cars = %w{ ford chevy honda toyota } 
#=> ["ford", "chevy", "honda", "toyota"] 
irb> @cars.each { |car| puts car } 
ford 
chevy 
honda 
toyota 
#=> ["ford", "chevy", "honda", "toyota"] 
irb> car 
NameError: undefined local variable or method `car` for #<Object:0x399770 @cars=["ford", "chevy", "honda", "toyota"]> 
     from (irb):3 
     from /usr/local/bin/irb:12:in `<main>` 
irb> for car in @cars 
    puts car.reverse 
    end 
drof 
yvehc 
adnoh 
atoyot 
#=> ["ford", "chevy", "honda", "toyota"] 
irb> car 
#=> "toyota" 

用/中には、その後のスコープでイテレータ変数を残します。

個人的に、私はruby's for/in構文を使っていません。

+1

+1 - それは私の答えよりもはるかに優れています – DanSingerman

+0

すばらしい返信ありがとう! :) – jacob

+0

+1:それは変です。 C#loopvarはfor構造体を使い果たしません。いずれにしても、それぞれに固執するもっと多くの理由 – Gishu

2

私はそれが構文的な砂糖だと思います。これは機能的には同等で、私は通訳者の実装上の違いを認識していません。

注 - 第2のもので「do」を失うことがあります。それは他の方法(等#inject#each_with_index#mapなど、ならびに非イテレータコールバック)に一般ため

関連する問題