为什么工厂函数fromto
不能将本地函数iter
作为迭代器返回到for循环?
function fromto(from,to)
return iter,to,from-1
end
local function iter(to,from)--parameter:invariant state, control variable
from = from + 1
if from <= to then
return from
else
return nil
end
end
for i in fromto(1,10) do
print(i)
end
最佳答案
正如@YuHao所说,你的计划可以奏效。有几种方法可以重新排列代码。这是一个:
local function fromto(from,to)
--parameter:invariant state, control variable
local function iter(to,from)
from = from + 1
if from <= to then
return from
else
return nil
end
end
return iter,to,from-1
end
for i in fromto(1,10) do
print(i)
end
需要理解两件事:变量作用域和函数都是值。
变量可以是全局变量,也可以是局部变量。局部变量具有词法作用域。它们的范围是从声明之后的语句到 block 的末尾。如果名称不是局部变量的名称,它将成为全局变量引用。在第 2 行,iter 是一个全局变量。
函数未声明,它们是执行函数定义表达式时创建的值。 (函数定义语句只是函数定义表达式和变量赋值的替代语法。)此外,函数没有名称。它们仅由一个或多个变量引用。因此,您的函数值确实存在并被 iter 变量引用,直到执行控制传递到包含函数定义的行为止。在您的代码中,这是第 11 行的末尾。
关于for-loop - 工厂函数无法将本地迭代器返回到lua中的for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31353292/