For loop 工厂函数无法将本地迭代器返回到lua中的for循环?
为什么工厂函数不能将本地函数iter作为迭代器返回for循环For loop 工厂函数无法将本地迭代器返回到lua中的for循环?,for-loop,lua,iterator,local,lua-5.3,For Loop,Lua,Iterator,Local,Lua 5.3,为什么工厂函数不能将本地函数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
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
工厂/迭代器函数已正确实现。问题是,通过使用
local function iter(to,from)
--...
end
相当于:
local iter = function(to,from)
--...
end
iter是fromto无法访问的局部变量。删除local,它就会运行。正如@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
需要了解两件事:变量范围和函数是值
变量可以是全局变量,也可以是局部变量。局部变量是词汇范围的。它们的作用域从声明后的语句一直到块的末尾。如果名称不是局部变量的名称,它将成为全局变量引用。在你的第2行,iter是一个全局变量
函数不是声明的,它们是在执行函数定义表达式时创建的值。函数定义语句只是函数定义表达式和变量赋值的替代语法。此外,函数没有名称。它们只是由一个或多个变量引用。因此,函数值确实存在并被iter变量引用,直到执行控制通过包含函数定义的行。在代码中,这是第11行的结尾
也可以在文件中将iter放在fromto之前,但我认为如果局部变量与另一个函数在同一个chunck中声明,那么另一个函数将访问它??因此我只需要在fromto返回它之前声明函数iter。此外,函数可以使用在其作用域之外和作用域之下声明的局部变量,对吗?没有不声明的函数。问题在于变量和范围。全局变量始终在作用域中,尽管它可能被具有相同名称的其他变量隐藏。局部变量的作用域是从声明它的点开始到声明它的块结束。所以,你们的iter是一个局部变量,在11到15行的范围内。请参阅。注意:iter变量不需要在使用函数值的范围内。您正在从工厂函数返回函数值,因此该值将继续存在,并由for语句重复调用。