(初心者の質問で申し訳ありません。) Ruby では、ループの違いは何ですか:
@cars.each do |car|
と
for car in @cars do
?
効率に違いはありますか、または同じことを表現するのに 2 つ (またはそれ以上) の方法が必要なのはなぜですか? 2 番目の方法は、私にはよりエレガントで自然に思えますが、最初の方法がより良い選択である理由について、いくつかの重要な観察を見落としている可能性があります。
(初心者の質問で申し訳ありません。) Ruby では、ループの違いは何ですか:
@cars.each do |car|
と
for car in @cars do
?
効率に違いはありますか、または同じことを表現するのに 2 つ (またはそれ以上) の方法が必要なのはなぜですか? 2 番目の方法は、私にはよりエレガントで自然に思えますが、最初の方法がより良い選択である理由について、いくつかの重要な観察を見落としている可能性があります。
@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構文を使用することはありません。
ただの糖衣だと思います。これは機能的には同等であり、インタプリタの実装の違いを認識していません。
注-2番目のものでは「do」を失う可能性があります。