| Раздел: 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
