1

This is my first attempt with LUA language, and I'm a little bit confused with variables declaration. I need to declare all variables as local, and as far I understand, local variable is only active on its scope (e.g. the function). What I need is pass a specific value to a function, "elaborate" it, and then assign another local function to be elaborated later, let's make a simple example:

local function test(x)
  local z=x
  return z
end

local x=1
test(x)

print(z)

So, 'x' is declared at main as local, then passed to the function. That function will just elaborate it and then assign the value to another local variable 'z'. The new variable will be used later outside the function. In the example I only assigned values, in the final code there will be much more operation on variables.

However the above print(z) will result in a nil value. I know that I can declare z as global, but unfortunately I have to keep local all variables because the script will be called by several thread, and 'x' can have different values while 'z' will be written as output.

Could someone help me to understand how to do that? Thank you, Lucas

EDIT: I can do something like:

local function test(x, y)
  local z=x+y
  local w=y-x
  return z,w
end

local z,w = test(1,2)

print(z)
print(w)

Is it a good approach? ...

2
  • obviously it is Commented Apr 17, 2022 at 7:21
  • Function arguments are local too and you dont need more when doing math in return. Check out: do local function test(x, y) return x + y, y - x end print(test(1, 2)) end Commented Apr 17, 2022 at 16:45

1 Answer 1

1

As mentioned in comment and your own EDIT shows that too...
The return of a function is important.
And default values for the Arguments you can do...
Guess!
...with local

-- sol.lua

local function sol(au, c)
-- If au or/and c equals nil then using default in meter ( after or )
 local au, c = au or 149597870700, c or 299792458
-- Than do all math in return
 return os.date('!%H:%M:%S', math.floor(au / c)), au, c
end

-- Defaults using meter
-- sol() is interpreting it as sol(nil, nil)
print(sol())
-- Should put out: 00:08:19    149597870700    299792458

-- au and c be averaged on kilometer
print(sol(15e+7, 3e+5))
-- Output: 00:08:20 150000000   300000

-- only au be averaged on meter
print(sol(15e+10))
-- 00:08:20 150000000000    299792458

-- Only c be averaged on meter
-- All notexistent or undefined variable names can be used for nil as well
-- An exception: false will fallback to default too
-- true will fail with: attempt to perform arithmetic on local 'au' (a boolean value)
print(sol(nil, 3e+8))
-- 00:08:18 149597870700    300000000

-- Check out whats wanted
-- Nearly the same like your EDIT approach
local _, au, c = sol()
print(string.format('Astronomical Unit => %d Meter\nSpeed of Light => %d Meter/Second', au, c))
-- Astronomical Unit => 149597870700 Meter
-- Speed of Light => 299792458 Meter/Second

-- Direct access
print(({sol()})[3])
-- 299792458
print(({sol()})[2])
-- 149597870700
print(({sol()})[1])
-- 00:08:19

-- Next makes sol.lua requirable
return sol
-- Example: sol = require('sol')

;-)

Sign up to request clarification or add additional context in comments.

2 Comments

Is there some relevance on declaring the arguments ('au' and 'c') as local (in sol function)?
The local declaration is in fact only for default middled values if they omitted.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.