Укажите, где параметр lua должен быть копией или ссылкой - PullRequest
0 голосов
/ 21 мая 2011

Мне интересно, есть ли способ указать, следует ли копировать или просто ссылаться на параметры функции lua. Цвет - это объект, представляющий цвет.

Например, с этим кодом

function editColor(col)
    col.r = 0
    print(tostring(col.r))
end

color = Color(255, 0, 0)
print(tostring(color.r))
editColor(color)
print(tostring(color.r))

Делает вывод

255
0
0

Таким образом, col - это «ссылка» на цвет, но этот код:

function editColor(col)
    col = Color(0, 0, 0)
    print(tostring(col.r))
end

color = Color(255, 0, 0)
print(tostring(color.r))
editColor(color)
print(tostring(color.r))

делает этот вывод

255
0
255

Так что здесь цвет копируется.

Есть ли способ принудительно скопировать или ссылаться на параметр? Так же, как оператор & в C ++?

Ответы [ 4 ]

5 голосов
/ 21 мая 2011

Нет, параметры в Lua всегда передаются по значению ( mirror ). Все переменные ссылки однако. Во втором примере в editColor вы переопределяете то, на что ссылается переменная col, но это только для этой области. Вам нужно будет что-то изменить, возможно, вместо того, чтобы передавать переменную для переназначения, заставить функцию возвращать что-то и выполнить переназначение снаружи. Удачи.

0 голосов
/ 23 ноября 2018

Луа - плохой язык. Потерпите простоту, когда вам нужно сделать что-то немного сложное.

0 голосов
/ 10 мая 2018

Это будет делать то, что вы хотите. Поместите переменную, которую вы хотите передать по ссылке, в таблицу. Вы можете использовать таблицу для передачи чего-либо по ссылке, а не только по строке.

-- function that you want to pass the string  
-- to byref.  
local function next_level( w )  
  w.xml = w.xml .. '<next\>'  
end  


--  Some top level function that you want to use to accumulate text
function top_level()  
      local w = {xml = '<top>'} -- This creates a table with one entry called "xml".  
                            -- You can call the entry whatever you'd like, just be  
                            -- consistant in the other functions.  
  next_level(w)  

  w.xml = w.xml .. '</top>'  
  return w.xml  
end  

--output: <top><next\></top>  
0 голосов
/ 25 июля 2013

вы можете использовать закрытие как это

function colorClosure()

    local col
    function editColor()
        col = Color(0, 0, 0)
        print(tostring(col.r))
    end

    color = Color(255, 0, 0)
    print(tostring(color.r))
    editColor(color)
    print(tostring(color.r))
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...