[lua] Настройка возвращаемого значения функции

Сегодня 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 не возвращает никаких значений.)

Guess you like

Origin blog.csdn.net/weixin_44559752/article/details/126171966