LUA 函数外的局部变量

LUA local variable outside a function

这是我第一次尝试 LUA 语言,我对变量声明有点困惑。我需要将所有变量声明为局部变量,据我所知,局部变量仅在其范围内有效(例如函数)。我需要的是将一个特定的值传递给一个函数,“细化”它,然后分配另一个本地函数,稍后细化,我们举个简单的例子:

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

local x=1
test(x)

print(z)

因此,'x' 在 main 中声明为本地,然后传递给函数。该函数将对其进行详细说明,然后将值分配给另一个局部变量 'z'。稍后将在函数外部使用新变量。示例中我只是赋值,在最终代码中会对变量进行更多的操作。

但是上面的 print(z) 将导致 nil 值。我知道我可以将 z 声明为全局变量,但不幸的是我必须保留所有变量的局部变量,因为该脚本将被多个线程调用,并且 'x' 可以有不同的值,而 'z' 将被写为输出.

有人可以帮助我了解该怎么做吗? 谢谢, 卢卡斯

编辑: 我可以这样做:

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)

这是一个好方法吗? ...

如评论中所述,您自己的编辑也表明...
函数的 return 很重要。
以及您可以执行的参数的默认值...
猜猜!
...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')

;-)