2014-01-25 17 views
7

我有一個生成一個數組作爲其結果的功能,並希望重複其結果執行一些操作:for-in循環是否計算一次收集部分?

for MyElm in AFunction(SomeVar) do 
begin 
    //... 
end; 

由於收集部分是一個函數的結果是很重要的,以確保它是隻執行一次。

問:是否在每次迭代時執行AFunction?

+0

當你測試,爲什麼要觀察? –

+0

@羅伯·肯尼迪。它執行一次。但我需要更多信息來確保任何特殊狀態(IDK編譯器指令等)。 – SAMPro

回答

9

該函數在for循環的開始處僅被​​計算一次。無論循環的開始還是結束都由函數定義,都沒有區別。

documentation

對於控制循環的執行的目的,表達初值和最終值僅計算一次,在循環開始

之前在特定的情況下,代碼

for MyElm in AFunction(SomeVar) do 
begin 
    //... 
end; 

在循環的第一次迭代中,編譯器插入到一個呼叫從函數調用返回的數組。然後它開始在循環的每次迭代中調用枚舉器的GetNext函數,並且只要它返回true它就會使用枚舉數的Current屬性從數組中讀取值。同樣,函數僅在循環的初始迭代中被調用以檢索數組。之後,數組的枚舉器將在每次傳遞時調用,以便順序移動數組本身。

所以你的問題的答案是否定的。該函數不是「每次迭代結果都執行」。該函數在循環開始時執行一次。

+2

這個引用是關於'for I:= initialValue到finalValue'循環的。我想你會加入陣列的,我的情況下Delphi編譯器實現了,在通過隱藏的索引變量循環和對 –

+1

舊的形式作爲@ Arioch'The說,你是從什麼報價在談論/環扣,不爲/在一個。也就是說,行爲是一樣的 –

+0

@ Arioch'The:更新爲直接尋址'for..in',以及'for..to'。 –