Раздел: CronosPRO Дата редакции: 12.07.2013 id статьи: 1544

Возврат значений из функции Lua

Функции могут возвращать одно или несколько значений, а также не возвращать значений вообще.
function f0() -- функция f0 не возвращает значений
   MsgBox ("Вызвана функция f0")
end
function f1()
   MsgBox ("Вызвана функция f1")
   return 1 -- функция f1 возвращает одно значение
end
function f3()
   MsgBox ("Вызвана функция f3")
   return 1, 2, 3 -- функция f3 возвращает три значения
end
f0() -- вызов функции f0
a = f1() -- вызов функции f1. a = 1
a, b, c = f3() -- вызов функции f3. a = 1, b = 2, c = 3
Если количество возвращаемых функцией значений превышает число переменных, которым эти значения должны быть присвоены, «лишние» значения отбрасываются. Если возвращаемых значений меньше, чем переменных, отсутствующие значения заменяются nil.
a = f3() -- a = 1, значения 2 и 3 отброшены
a, b, c = f3() -- a = 1, b = 2, значение 3 отброшено
a, b, c = f0() -- a = nil, b = nil, c = nil
a, b, c = f1() -- a = 1, b = nil, c = nil
Вне зависимости от того, возвращает функция значения или нет, её можно вызвать как оператор. Все возвращаемые функцией значения в этом случае будут отброшены:
f3() -- значения, возвращенные функцией f3, отброшены
Возникают ситуации, когда функция возвращает несколько значений, а переменной требуется присвоить только одно из них. Например, функция возвращает три значения, а для работы нужно только последнее:
local a, b, c = f3()
Как не задавать лишних имён переменных?
Здесь общепринятым способом является использование переменной с именем «_» (символом подчёркивания). Это упрощает внешний вид выражения и указывает на реально используемые переменные.
local _, _, c = f3() -- нам нужно только третье возвращаемое значение
В данном случае, переменная «_» принимает первое, а потом второе возвращаемое значение.
Такой же подход часто используется в работе с итераторами:
for _, value in pairs() do 
... -- нам нужно только очередное значение, ключ будет присвоен переменной _
end

Обратите внимание

  • Переменная с именем «_» является обычной переменной. При использовании этой переменной в других выражениях, она будет переопределяться, т. е. содержать то значение, которое было ей присвоено в последний раз:

    local _, _, c = f3() -- переменная _ будет содержать второй параметр
    ...
    f4(_, true) -- первым параметром функуции f4 будет не пустое значение, 
                   а значение содеражащееся в переменной _

Возврат значений при множественном присваивании

При использовании множественного присваивания все возвращаемые функцией значения учитываются только в том случае, если вызов функции является последним (или единственным) выражением в списке выражений справа от оператора присваивания. В противном случае в присваивании участвует только одно (первое) возвращённое функцией значение.
a, b, c, d = 5, f3() -- a = 5, b = 1, c = 2, d = 3
a, b, c, d = f3(), 5 -- a = 1, b = 5, c = nil, d = nil
Аналогичным образом учитываются результаты вызова функции, включённого в конструктор таблицы, список аргументов другой функции и в список результатов, возвращаемых оператором return.
t = {5, f3()} -- t = {5, 1, 2, 3}
t = {f3(), 5} -- t = {1, 5}
func (5, f3()) -- вызов функции func с аргументами 5, 1, 2, 3
func (f3(), 5) -- вызов функции func с аргументами 1, 5
return 5, f3() -- возврат значений 5, 1, 2, 3
return f3(), 5 -- возврат значений 1, 5

Возврат функций из функций

Функции можно возвращать из функций. Например:
function outer()
   function inner()
      return 1 
   end
   return inner
end
local i = outer() -- значение переменной i равно функции inner
local a = i() -- вызываем функцию i, значение переменной a равно 1