来源 https://segmentfault.com/a/1190000000409668
命令行参数
命令行参数存储在arg 表中,假定你有一个foo.lua 脚本:
print(arg[-1], arg[0])
for i, v in ipairs(arg) do print(v) end
假设我们运行lua foo.lua arg1 arg2 arg3 ,输出为:
lua foo.lua
arg1
arg2
arg3
文件中的...
由于文件以函数的方式加载,所以我们可以用上... 。假定bar.lua 内容如下:
print(...) -- 输出所有传递给该文件函数的参数
以如下语句加载:
loadfile("bar.lua")(1, 2, 3, 4)
输出为1 2 3 4 .
dofile 不发送参数,require 发送给定的路径:
require("bar") -- "bar"
require("folder.subfolder.bar") -- "folder.subfolder.bar"
如果你运行lua bar.lua arg1 arg2 arg3 ,会输出arg1 arg2 arg3 。
_G
里面存了所有的全局变量:
a = 3
print(_G.a) -- 3
_G.b = 4
print(b) -- 4
print(_G._G == _G) -- true
来源 https://segmentfault.com/a/1190000004200022
局部变量和全局变量
如果为了更严格的使用局部变量,可以用do-end来界定一个块。即在do之后end之前组成一个作用域。
do
local a = 10
...
end
print( a )
Lua中这个全局变量本质上也是一个table, 它把我们创建的全局变量都保存在一个table里了。这个table名为_G。所以我们可以这样返回全局变量:
print( _G["myGlobal"] )
unpack
在多重返回值中,unpack,它接受一个数组为参数,它返回下标为1开始的所有元素。
local function Foo(a, b)
print(a, b)
end
local tab = {1,2}
Foo(unpack(tab))
变长参数
function add(...)
local s = 0
for i, v in ipairs{...} do
s = s + v
end
return s
end
print( add(2,3,3) )
参数表三个点表示可接受不同数量的实参。
具名实参
function Add(options)
if type(options.num1) ~= "number" or type(options.num2) ~= "number" then
error("Add parameter are not number type")
end
print(options.num1, options.num2)
end
Add{num2=5,num1=4}
匿名函数与闭包
foo = function (x) return 2*x end
尾调用
当一个函数调用另一个函数的最后一个动作时,该调用就算是一条尾调用。
尾调用不耗费任何栈空间,故在递归函数里使用尤现优势。
function f(x) return g(x) end
默认形参
function func(x)
x = x or 0
|
请发表评论