Луа изменить массивы внутри функции - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь изменить коллекцию массивов внутри функции переменной. Я заканчиваю работать над копией, когда пытаюсь добавить в массивы, и они теряются после вызова. Есть ли способ передать значения по ссылке в Lua?

function myfunc(...)
local args = {...}
--do work on args--
end

"do work" на самом деле ничего не делает, но отлично работает вне функции.

Очевидно, что я мог бы передавать массив массивов и не использовать ... но это своего рода побеждает цель использования ...

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

В Lua нельзя просто передавать переменные по ссылке или нет. Базовые типы никогда не передаются по ссылке (например, числа и логические значения), другие всегда передаются по ссылке (например, таблицы, пользовательские данные и строки). В случае строк это не имеет большого значения, потому что они в любом случае неизменны.

То есть вы передаете свои аргументы, над которыми хотите работать глобально, в виде строк, подобных этой:

a=2
b=3
function myfunc(...)
   local args={...}
   for k,v in pairs(args) do
       _G[v]=_G[v]+k
   end
end
myfunc('a')
print(a) -- 3
myfunc('a','b')
print(a,b) -- 4    5

Обратите внимание, что это работает только для глобалов, поскольку локальные данные не хранятся в таблице.

Работа с таблицами делает такие вещи менее болезненными:

function myfunc(t)
    for k,v in pairs(t) do
           t[k]=v+k
    end
end
tab1={a=2}
myfunc(tab1)
print(tab1.a) -- 3
tab2={a=2,b=3}
myfunc(tab2)
print(tab2.a,tab2.b) -- 3    5
0 голосов
/ 19 марта 2012

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

Все натуральные типы в Lua передаются по значению, единственное исключение составляют таблицы.

Самый простой способ сделать то, что вы хотите, это передать массив массивов. Если два дополнительных символа кажутся слишком большими при наборе текста, знайте, что вместо них можно удалить скобки:

foo({a,b,c})
foo{a,b,c} -- equivalent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...