Сегодня Maillist столкнулся с проблемой: всегда ли возвращаемое значение функции будет скорректировано не более чем до одного значения?
local a, b, c = f(), x -- f() is adjusted to 1 result (c gets nil)
Вывод: нет
Lua скорректирует количество возвращаемых значений функции и скорректирует его до 1 тогда и только тогда, когда функция не является последним значением rvalue. В противном случае он корректируется до суммы, полученной по lvalue.
Короче говоря, возвращаемое значение оценивающей функции будет скорректировано на несколько, просто чтобы увидеть, является ли функция последним значением r
: если нет, возвращаемое значение функции будет скорректировано до 1; если это последнее значение r, то слева есть несколько получателей, и функция будет иметь несколько возвращаемых значений (заполните недостающую часть nil)
Возьмите каштан:
local function returnTest()
return 3, 2, 1
end
-- 不是最后一个右值,返回值的个数调整成1
local a, b, c = "first", returnTest(), "last"
print("when function isn't the last element:\n", a, b, c)
-- 是最后一个右值,等号左边还有两个变量可以接收,返回值的个数调整成2
local a, b, c = "last", returnTest()
print("when function is the last element:\n", a, b, c)
-- 是最后一个右值,等号左边还有四个变量可以接收,返回值的个数调整成4。原函数只返回3个,不足的1个用nil补齐
local a, b, c, d, e = "last", returnTest()
print("when function is the last element:\n", a, b, c, d, e)
-- 是最后一个右值,由于接收者是函数,可以接收任意个值,所以返回值的个数不进行调整
print("when function is the last parameter of another function:\n", returnTest())
-- 是最后一个右值,由于无接收者,可以接收0个值,所以返回值的个数调整为0
returnTest()
выход:
when function isn't the last element:
first 3 last
when function is the last element:
last 3 2
when function is the last element:
last 3 2 1 nil
when function is the last parameter of another function:
3 2 1
5.4 Оригинальный текст справочника:
И вызовы функций, и выражения vararg могут привести к нескольким значениям. Если вызов функции используется как оператор (см. §3.3.6), то его возвращаемый список корректируется до нулевых элементов, таким образом отбрасывая все возвращаемые значения. Если выражение используется в качестве последнего (или единственного) элемента списка выражений, корректировка не выполняется (если только выражение не заключено в круглые скобки). Во всех других контекстах Lua корректирует список результатов до одного элемента, либо отбрасывая все значения, кроме первого, либо добавляя один ноль, если значений нет.
Вот некоторые примеры:
f() -- adjusted to 0 results
g(f(), x) -- f() is adjusted to 1 result
g(x, f()) -- g gets x plus all results from f()
a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
a,b = ... -- a gets the first vararg argument, b gets
-- the second (both a and b can get nil if there
-- is no corresponding vararg argument)
a,b,c = x, f() -- f() is adjusted to 2 results
a,b,c = f() -- f() is adjusted to 3 results
return f() -- returns all results from f()
return ... -- returns all received vararg arguments
return x,y,f() -- returns x, y, and all results from f()
{f()} -- creates a list with all results from f()
{...} -- creates a list with all vararg arguments
{f(), nil} -- f() is adjusted to 1 result
Любое выражение, заключенное в круглые скобки, всегда дает только одно значение. Таким образом, (f(x,y,z)) всегда является одним значением, даже если f возвращает несколько значений. (Значение (f(x,y,z)) — это первое значение, возвращаемое f, или nil, если f не возвращает никаких значений.)