Lua的require函数是否可以返回多个结果?

可以通过 require 函数创建返回多个结果的 Lua 模块吗?我正在编写一个扩展包加载器的扩展,想知道是否需要支持此类行为。

例如,考虑以下名为 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 语法),我在任何地方都找不到明确的答案。

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

点赞
stackoverflow用户814297
stackoverflow用户814297

loadlib.c 文件中实现 require 函数用于导出 Lua 5.1.3 版本。这个函数总是返回 1 作为堆栈中的返回值数量。

2012-02-27 19:03:31
stackoverflow用户103715
stackoverflow用户103715

你可以从你的模块中返回一个函数,并让它返回多个值,就像下面这样:

foo.lua

return function() return "abc", 123 end

bar.lua

local a, b = require "foo" ()
2013-04-14 13:08:44
stackoverflow用户10858480
stackoverflow用户10858480

有时,如果需要返回某个条目,可能更好将“表”返回。


-- -- -- -- **Parent.Lua** -- -- -- --

local ChildReturns=require("Child");
print("The favourite toy is "..ChildReturns.GetFavourieToy());
print("List ALL toys on the child's favourites list:-");
for F_vK,F_vV in ipairs(ChildReturns) do
   print(F_vK,F_vV);
end

-- -- -- -- **Parent.Lua** -- -- -- --

local ChildReturns=require("Child");
print("The favourite toy is "..ChildReturns.GetFavourieToy());
print("List ALL toys on the child's favourites list:-");
for F_vK,F_vV in ipairs(ChildReturns) do
    print(F_vK,F_vV);
end

== == == ==

The favourite toy is Lego
List ALL toys on the child's favourites list:-
1       Lego
2       Meccano

如果需要,甚至可以使用“unpack”命令。

2019-08-22 03:07:50
stackoverflow用户12379754
stackoverflow用户12379754

这是我做的方法:

foo.lua

return {val1, val2}

bar.lua

myval1, myval2 = unpack(require('foo'))

对于你来说,可能是 table.unpack,不确定。

返回一个函数也很方便,但我认为 upack(require()) 可以准确地告诉你正在发生什么事情。

2021-11-30 14:40:54
stackoverflow用户11740758
stackoverflow用户11740758

当需要的 Lua 脚本以表格形式返回多个结果时,例如…

-- req.lua
return {one = 1, two = 2, three = 3}

…那么你可以使用以下代码捕获其中一个结果:

print(require('req').two) -- 输出:2

因为只有第一个返回值会进入 package.loaded.req,所以对于 require() 的脚本来说,不在表格中的多个结果并没有太多意义。

2021-11-30 16:23:21