是否返回。

我正在学习 Lua 协程。我发现一个奇怪的事情,以下两种写法都可以:


meta = function ()
    for i = 1, 10 do
        coroutine.yield(i)
    end
end

for i in coroutine.wrap(function() return meta() end) do
    print(i)
end


meta = function ()
    for i = 1, 10 do
        coroutine.yield(i)
    end
end

for i in coroutine.wrap(function() meta() end) do
    print(i)
end

(注意第一个版本的返回值)它们的运行结果是相同的:

~/test% lua t.lua
1
2
3
4
5
6
7
8
9
10

那么,return 的作用是什么呢?我认为 meta() 将会返回一个值,匿名函数应该也要返回它。那么为什么没有 return 的匿名函数也能正常工作呢?

原文链接 https://stackoverflow.com/questions/6034820

点赞
stackoverflow用户600500
stackoverflow用户600500

不,meta 不会返回任何东西 - 至少没有重要的东西。

传递给外层循环变量 i 的输出来自 yield 方法,而不是返回值。

如果按照以下方式编写循环,则可以看到:

for i in coroutine.wrap(function()
           val = {meta()}
           print ("----")
           print (val)
        end) do
    print(i)
end

输出结果为

1
2
3
4
5
6
7
8
9
10
----
nil

匿名函数和 meta 方法仅被调用一次。

2011-05-17 18:32:36