2016-12-11 9 views
5

実際の初心者の質問です...forループでは、ループパラメータはいつ評価されますか?

ループでは、ループパラメータはいつ評価されますか?ここで

は、ループはそう cは明らかたびにループが始まる「チェックされて」は、永遠に実行されます。

c= [1] 
for i in c 
    push!(c, i) 
    @show c 
end 
c = [1,1] 
c = [1,1,1] 
c = [1,1,1,1] 
... 

しかし、このループは一度だけ評価されます

c= [1] 
for i in 1:length(c) 
    push!(c, i) 
    @show c 
end 
c = [1,1] 

この1つのルックスようにすべてのループを評価するような:

c= [1] 
for (i, _) in enumerate(c) 
    push!(c, i) 
    @show c 
end 
c = [1,1] 
c = [1,1,1] 
c = [1,1,1,1] 
... 

しかし、これOPは明らかにされていません。

c= [1] 
for i in eachindex(c) 
    push!(c, i) 
    @show c 
end 
c = [1,1] 

をそして、この処理が行われます。

c= [1] 
foreach(a -> (push!(c, a); @show c), c) 
c = [1,1] 
c = [1,1,1] 
c = [1,1,1,1] 
...  

私が言ったように、それは本当の初心者の質問です。しかし、私は一般的なパターンを欠いていますか?私は、主なポイントは、あなたの様々なループは、オブジェクトの二つの異なるタイプのジュリアのIteratorインターフェイスを呼び出していることであると考えてい

答えて

6

  • 配列オブジェクトc自体は

  • AbstractUnitRangeオブジェクト(またはの1そのサブタイプ)


for i in cでループすると、Juliaはどのくらい大きいのか分かりませんcです。すべてのジュリアのニーズは、現在の反復の状態(到達したインデックス)と、次に訪問するインデックスはcでなければなりません。この次のインデックスが範囲外になる場合は、cを反復処理し終わったかどうかをテストできます。ジュリアさんiterator interfaceドキュメントから

コピー、このようなループは、本質的に沸く:あなたはループの本体にcに追加する場合は、必ず次の訪問するインデックス(すなわちwhile !done(c, state)意志があるでしょう

state = start(c) 
while !done(c, state) 
    (i, state) = next(c, state) 
    # body 
end 

常にtrueとなります)。アレイcは、メモリがいっぱいになるまで増えます。 enumerateforeachの両方を使用して

ループは同じように配列cにIteratorインターフェイスに依存し、これらのループ中にcを変更するときに、あなたは同様の動作を参照してください。一方


for i in 1:length(c)for i in eachindex(c)を使用してループはc自体を繰り返し処理していないが、別のオブジェクトがイテレータインターフェースをサポートします。

重要な点は、これらのオブジェクトがより前に作成され、反復が開始され、ループの本体でcを変更するときに影響を受けないことです。

最初のケースでは、length(c)が計算され、1:length(c)UnitRangeタイプのオブジェクトとして作成されます。あなたの例では、1から始まり1で停止するので、反復中にはからcに一度だけ移動します。

eachindex([1])を呼び出すと、Base.OneToオブジェクトが返されます。 UnitRangeオブジェクトのように、1から始まることが保証されている点を除いて。Base.OneTo(1)が作成され、1から開始して1で停止します。

これらのオブジェクトの両方は、サブタイプがAbstractUnitRangeであり、最終的にはサブタイプがAbstractArrayです。イテレーター・インターフェースを使用すると、これらのオブジェクトが保持する値に順番にアクセスできます。

+0

良い回答ありがとうございます。公式の文書に追加する価値があるかもしれない...私は一日PRにするつもりかもしれない... :) – daycaster

+0

喜んで助けた。良いアイデア:私はJuliaのドキュメントは一般的に非常に優れていると思っていますが、適切な場所で反復する方法の違いを強調することは有用かもしれません。 –

関連する問題