2012-02-27 107 views
14

可以創建一個通過require函數返回多個結果的Lua模塊?我目前正在爲package.loaders寫一個擴展,我想知道是否需要支持這樣的行爲。Can Lua的require函數可以返回多個結果嗎?

例如,採取以下模塊,名爲mod.lua

print("module loading") 
return "string1", "string2" 

這是由下面的腳本需要:

print("running script") 
s1, s2 = require("mod") 
print("s1: " .. tostring(s1)) 
print("s2: " .. tostring(s2)) 

結果在下面的輸出:

running script 
module loading 
s1: string1 
s2: nil 

當我期望第二個字符串被返回。我不想使用這樣的行爲,我意識到你可以通過返回一個表並解包來複制它,我只想知道它是否有用(因爲它是有效的Lua語法),而且我找不到在這個任何地方的確切答案。

回答

10

的Lua 5.1.3
require LUA出口在static int ll_require (lua_State *L)實施了loadlib.c文件。該函數始終返回1作爲堆棧上返回值的數量。

+1

呀,它看起來通過這種方式查看源代碼(我在Lua 5.2上,它是相同的單一返回值)。我想這個限制的部分原因是它將結果存儲在'_LOADED [「mod」]中,並且不能從那裏返回多個值,而無需將它們打包在表中並再次解包,這在大多數情況下是不必要的。 – GooseSerbus 2012-02-27 19:20:16

+1

@GooseSerbus這也是因爲'require'修改了返回值。如果模塊返回'nil','require'將返回'true'。 – finnw 2012-02-27 23:46:20

8

你總是可以從你的模塊返回功能,並有回報倍數值,如下圖所示:

foo.lua

return function() return "abc", 123 end 

bar.lua

local a, b = require "foo"()