12

(初心者の質問で申し訳ありません。) Ruby では、ループの違いは何ですか:

@cars.each do |car| 

for car in @cars do

?

効率に違いはありますか、または同じことを表現するのに 2 つ (またはそれ以上) の方法が必要なのはなぜですか? 2 番目の方法は、私にはよりエレガントで自然に思えますが、最初の方法がより良い選択である理由について、いくつかの重要な観察を見落としている可能性があります。

4

2 に答える 2

20

@cars.each他のメソッド(、、、など、および非イテレータコールバックなど)に一般化されるため、より多くの人がこの表記を使用#injectします。#each_with_index#map

for / inは、主にの構文糖衣です#each。2つの動作の主な違いは、可変スコープにあります。

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"

for / inは、後でイテレータ変数をスコープ内に残しますが、そうではあり#eachません。

個人的には、rubyのfor/in構文を使用することはありません。

于 2009-07-23T14:58:29.213 に答える
2

ただの糖衣だと思います。これは機能的には同等であり、インタプリタの実装の違いを認識していません。

注-2番目のものでは「do」を失う可能性があります。

于 2009-07-23T14:54:36.473 に答える