Что значит "object = {...}" в lua? - PullRequest
       0

Что значит "object = {...}" в lua?

1 голос
/ 20 сентября 2019

Я недавно читал про lua и дополнения к игре "World of Warcraft".Так как язык интерфейса для аддонов - это lua, и я хочу выучить новый язык, я подумал, что это хорошая идея.

Но есть одна вещь, которую я не могу узнать.Почти в каждом аддоне есть строка сверху, которая выглядит для меня как конструктор, который создает объект, к которому я могу иметь доступ.Эта строка выглядит примерно так:

object = {...}

Я знаю, что если функция возвращает несколько значений (что является ИМХО одним огромным плюсом для lua), и я не хочу хранить их отдельно в нескольких значениях, яможно просто написать

myArray = {SomeFunction()}

, где myArray теперь таблица, содержащая значения, и я могу получить доступ к значениям, проиндексировав ее (myArray[4]).Поскольку элементы не являются явно типизированными, поскольку их значения содержат только значения, это хорошо для lua.Я также знаю, что «...» можно использовать для массива параметров в функции в том случае, если функция не знает, сколько параметров она получает при вызове (например, String[] args в Java).Но для чего в имени богов используется эта «фигурная скобка - точка, точка, точка - фигурная скобка»?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

Вы уже сказали все, что есть в своем вопросе:

{...} на самом деле является просто комбинацией двух описанных вами поведений: он создает таблицу, содержащую все аргументы, поэтому

function foo(a, b, ...)
   return {...}
end

foo(1, 2, 3, 4, 5) --> {3, 4, 5}

По сути, ... - это просто нормальное выражение, как и вызов функции, который возвращает несколько значений.Следующие два выражения работают точно так же:

local a, b, c = ...
local d, e, f = some_function()

Имейте в виду, что это имеет некоторые последствия для производительности, поэтому, возможно, не используйте его в функции, которая вызывается примерно 1000 раз в секунду;)


РЕДАКТИРОВАТЬ:

Обратите внимание, что это действительно не относится только к "функциям".Функции на самом деле являются скорее синтаксической функцией, чем все остальное.Под капотом Lua знает только куски, в которые превращаются обе функции и файлы .lua.Итак, если вы запускаете скрипт Lua, весь скрипт превращается в кусок и поэтому не отличается от функции.

С точки зрения кода, разница в том, что с помощью функции вы можете указать имена для ееаргументы вне его кода, тогда как с файлом вы уже находитесь на внешнем уровне кода;«вне» файла нет.

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

Когда вы вызываете файл типа lua script.lua foo bar, внутри script.lua, ... будет фактически содержать два аргумента "foo" и "bar", так что это также удобный способ доступа к аргументам при использовании Lua для автономных скриптов.

В вашем примере это на самом деле очень похоже.Скорее всего, где-то еще ваш скрипт загружается с load(), который возвращает функцию, которую вы можете вызвать - и, как вы уже догадались, передать аргументы.

Представьте себе следующую ситуацию:

function foo(a, b)
   print(b)
   print(a)
end

foo('hello', 'world')

Это почти эквивалентно

function foo(...)
   local a, b = ...
   print(b)
   print(a)
end

foo('hello', 'world')

, что на 100% (за исключением, возможно, по производительности) эквивалентно

-- Note that [[ string ]] is just a convenient syntax for multiline "strings"
foo = load([[
   local a, b = ...
   print(b)
   print(a)
]])

foo('hello', 'world')
1 голос
/ 20 сентября 2019

Из Lua 5.1 Справочное руководство затем {...} означает аргументы, переданные программе.В вашем случае это, вероятно, аргументы, передаваемые игрой аддону.

Вы можете увидеть ссылки на это в этом вопросе и в этой теме .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...