我有一个函数可以生成一个数组作为结果,并希望迭代其结果以执行某些操作:
for MyElm in AFunction(SomeVar) do
begin
//...
end;
因为集合部分是函数的结果,所以确保它只执行一次是很重要的。
问:每次迭代都会执行AFunction吗?
答案 0 :(得分:9)
在for
循环开始时,该函数只被评估一次。循环的开始或结束是否由函数定义没有区别。
为了控制循环的执行,表达式initialValue和finalValue仅在循环开始之前计算一次
如果是您的特定代码
for MyElm in AFunction(SomeVar) do
begin
//...
end;
在循环的第一次迭代中,编译器为函数调用返回的数组插入对GetEnumerator
的调用。然后它开始在循环的每次迭代中调用枚举器的GetNext
函数,并且只要它返回true
,它就会使用枚举器的Current
属性从数组中读取值。因此,仅在循环的初始迭代时调用该函数以检索该数组。之后,每次传递都会调用数组的枚举器,以便顺序遍历数组本身。
所以问题的答案是否定的。该函数不是“在其结果的每次迭代时执行”。该函数在循环开始时执行一次。