lua 基本语法

基本语法

注释

-- single line comment

--[[
    mutil line comments
]]

关键词

变量名避免与以下关键词重复。

and break do else elseif end false for
function if in local nil not or repeat
return then true until while goto

变量

默认情况下,变量总是 全局变量 , 局部变量需要使用 local 标记。

a = 1               -- global value
local b = 2         -- local value

function test()
    c = 3           -- global value
    local d = 4     -- local value
end

Lua 的变量与 Python 一样也是弱类型,无需明确指定数据类型,Lua解释器自动识别或转换。

数据类型

lua 包含8个基本数据类型: nil, boolean, number, string, userdata, function, thread, table

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays)

Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

table 在 Lua 几乎是万能的,随处可见,可实现类似数组、字典、类C语言的结构体、面向对象相关等。

nil 有点类似C语言的 NULL 或者 void,在逻辑判断中需要加双引号,并且其值等价于 false.

值得注意的是,Lua 中的 0 并不代表 false, 这是与绝大多数编程语言不一样的地方。

运算符

算术运算符

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • % 取余
  • ^ 乘幂
  • - 负号

关系运算符

  • == 等于
  • ~= 不等于
  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于

逻辑运算符

  • and
  • or
  • not

其它运算符

  • .. 连接字符串
  • # 返回字符串或表的长度,如 #"Hello" 返回 5

循环

while 循环

while (codition)
do
    statements
end

注意与shell不同,lua 是以 end 结束,不是 done。while 例程如下:

i=10
while (i > 0)
do
    print ("i:", i)
    i = i-1
end

for 循环

  • 数值循环
for var=exp1,exp2,exp3 do
    statements
end

var 从 exp1 以 exp3 为步进,逐渐变化到exp2, 类似C语言中的

for (var = exp1; var < exp2; var += exp3) {
    statements
}

lua 数值 for 循环例程

for var=1,10,2 do
    print(var)
end
  • 泛型循环

lua 还有另外一种for循环,被称为 泛型 for 循环。与 Python 很像,就是迭代输出。

a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v) -- i: index, v: value
end 

repeat...until 循环

repeat
    statements
until( condition )

乍一看和 C 的 do...while 很像,但实际不一样, do...while 是当 while 条件满足时执行,而 repeat...until 则相反,当until条件不满足时执行。其实 lua 的也很好理解,不断重复 (repeat) 某件事直到 (until) 满足某个条件才停止。思想是差不多的。

实例如下:

i = 1
repeat
   print("i:", i)
   i = i + 1
until( i > 10 )

条件判断

if (condition)
then
    statements
end

if (condition-1)
then
    statements-1
elseif (condition-2)
then
    statements-2
else
    statements-3
end

if elseif else 例程

a = 1

if( a == 1 )
then
   print("a is 1" )
elseif( a == 2 )
then  
   print("a is 2" )
elseif( a == 3 )
then
   print("a is 3" )
else
   print("not found a" )
end

函数

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end
  • optional_function_scope: 该参数是可选的,指定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
  • function_name: 指定函数名称。
  • argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
  • function_body: 函数体,函数中需要执行的代码语句块。
  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

例程

function add(a, b)
    return a + b;
end

print(add(1,2))

多返回值

lua 的函数可以返回多值,比如在一个数组中找到最大值及其所在位置。

function maximum (a)
    local mi = 1             -- max index
    local m = a[mi]          -- max value
    for i,val in ipairs(a) do
       if val > m then
           mi = i
           m = val
       end
    end
    return m, mi
end

print(maximum({2,12,22,14,8}))

可变参数

和C类似,lua也支持可变参数,使用 ... 代表可变参数。

function add(...)
local s = 0
  for i, v in ipairs{...} do   --/* {...} is a array */
    s = s + v
  end
  return s
end
print(add(1,2,3,4,5,6))

执行系统指令

  • os.execute
os.execute('date')
os.execute('ls')
  • io.popen
fd = io.popen('date')
out = fd:read("*all")
fd:close()
print(out)

io.popen 需要 lua 在编译时启用 LUA_USE_LINUX 这个宏,否则不会支持。

参考文档