Может ли Lua требовать, чтобы функция возвращала несколько результатов?

Можно создать модуль Lua, который возвращает несколько результатов через функцию require? В настоящее время я пишу расширение для package.loaders, и я хочу знать, нужно ли мне поддерживать такое поведение.

Например, возьмите следующий модуль с именем mod.lua:

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

Требуется следующее script:

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

Результаты в следующем выпуске:

running script
module loading
s1: string1
s2: nil

Когда я ожидаю, что вторая строка будет возвращена. Я не собираюсь использовать такое поведение, и я понимаю, что вы можете реплицировать его, возвращая таблицу и распаковывая ее, я просто хочу знать, если она предназначена для работы (как ее синтаксис Lua), и я не могу найти окончательный ответ на это где угодно.

Ответы

Ответ 1

Lua 5.1.3
require Экспорт lua реализован в static int ll_require (lua_State *L) в loadlib.c файле. Эта функция всегда возвращает 1 как количество возвращаемых значений в стеке.

Ответ 2

Вы всегда можете вернуть функцию из своего модуля и вернуть несколько значений, например ниже:

foo.lua

return function() return "abc", 123 end

bar.lua

local a, b = require "foo" ()

Ответ 3

Иногда может быть предпочтительнее вернуть "таблицу", если записи, в зависимости от того, что вам нужно вернуть.


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

local ChildReturns=require("Child");
print("The favourite toy is "..ChildReturns.GetFavourieToy());
print("List ALL toys on the child 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 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 favourites list:-
1       Lego
2       Meccano

А при необходимости можно даже использовать команду "распаковать".