2011-05-17 168 views
4

我正在學習Lua協同程序。我發現了一個weired事情對我來說,無論是退貨或不退貨


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的匿名函數也是對的?

回答

1

不,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 

的anoymous功能,以及meta,只調用一次。

+0

謝謝!所以我知道coroutine.resume/yield是「返回」值的其他路徑。 ;) – Grissiom 2011-05-18 02:55:58