Page 1 of 1

How to get reference to variable within a function?

Posted: Sat Jun 18, 2022 4:53 pm
by ddabrahim
Hi everyone.

So I have an interesting problem to solve.
I would like to modify a local variable inside a function
This is what I would like to do:

Code: Select all

local a = 10

print(a) -->>output 10

myFunction = function(_value)
	_value = _value + 1
end

myfunction(a)

print(a) -->> output 11
I prefer not to make the variable global and not to work with the actual variable name within the function. Instead I would like to work with just a reference to a variable so I can pass any variable to the function to work with.

I was searching the Lua documentations and the web but could not find any solution.

One thing that was repeatedly come up in searches is to use a C module to use pointers to get a reference to the variable in memory but no info was shared how to do that exactly and I don't have a lot of experience with C.

So I was wondering, is there anything like a pointer in Lua to pass a variable by reference to a function or could someone recommend a library to work with memory addresses of variables to get around this?

I would appreciate any help.

Thank you.

Re: How to get reference to variable within a function?

Posted: Sat Jun 18, 2022 4:59 pm
by pgimeno
Not possible.

There are two ways around it:

1) Return the value and assign it:

Code: Select all

function inc(x)
  return x + 1
end

a = 5
a = inc(a)
print(a) -- prints 6
2) Use a table:

Code: Select all

obj = {}
obj.a = 5

function inc_a(t)
  t.a = t.a + 1
end

inc_a(obj)

print(obj.a) -- prints 6
Edit: Or this variant:

Code: Select all

function inc(t)
  t[1] = t[1]+ 1
end

a = {5}

inc(a)

print(a[1]) -- prints 6

Re: How to get reference to variable within a function?

Posted: Sat Jun 18, 2022 8:31 pm
by ddabrahim
Thanks a lot.

Using a table works nicely. I can even pass the variable name as a string. So then I can make the function work with any variable.
This is what I do.

Code: Select all

obj = {}
obj.a = 10

myFunction = function(_t,_n)
    _t[_n] = _t[_n] + 1
end

myFunction(obj, "a")

print(obj.a) -- output 11
I am happy with it.
Thanks :)