Hello World
交互式编程
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:
[huey@huey-K42JE lua]$ lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print("hello world")
hello world
脚本式编程
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:
print("hello world")
使用 lua 命令执行以上脚本,输出结果为:
[huey@huey-K42JE lua]$ lua hello.lua
hello world
或者将代码修改为如下形式来执行脚本:
#!/usr/bin/lua
print("hello world")
为 hello.lua 添加可执行权限,并执行
[huey@huey-K42JE lua]$ chmod a+x hello.lua
[huey@huey-K42JE lua]$ ./hello.lua
hello world
注释
单行注释:
-- 单行注释
多行注释:
--[[
多行注释
多行注释
--]]
数据类型
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 |
我们可以使用 type 函数测试给定变量或者值的类型:
print( type(nil) ) -- nil
print( type(true) ) -- boolean
print( type(10.4 * ) ) -- number
print( type("Hello world") ) -- string
print( type(print) ) -- function
print( type({"a", "b", "c", "d"}) ) -- table
nil
nil 类型表示一种没有任何有效值,它只有一个值 nil,例如打印一个没有赋值的变量,便会输出一个 nil 值:
> print(undefined_value)
nil
对于全局变量和 table,nil 还有一个 “删除” 作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉。
boolean
boolean 类型只有两个可选值:true 和 false,Lua 把 false 和 nil 看作是 “假”,其他的都为“真”。
string
字符串由一对双引号或单引号来表示。
> print("it's ok")
it's ok
> print('This is a "hello world" program')
This is a "hello world" program
也可以用 2 个方括号 “[[]]” 来表示一块字符串。
html = [[
<html>
<body>
<a href="http://www.lua.org/">Lua</a>
</body>
</html>
]]
使用 “..” 拼接字符串:
> print("hello" .. "world")
helloworld
使用 “#” 计算字符串长度:
> print(#"abcdefg")
7
循环
while 循环
while(condition)
do
statements
end
for 循环
数字 for 循环
for v = e1, e2, e3 do block end
v 从 e1 变化到 e2,每次变化以 e3 为步长递增 v,并执行一次 block。e3 是可选的,如果不指定,默认为 1。
泛型 for 循环
for i, v in ipairs(a)
do
-- do something with i & v
end
i 是数组索引值,v 是对应索引的数组元素值。ipairs 是 Lua 提供的一个迭代器函数,用来迭代数组。
repeat ... until 循环
repeat ... until 循环类似其他语言的 do ... while 循环。
repeat
statements
while( condition )
条件控制
格式
if exp then block {elseif exp then block} [else block] end
函数
定义:
function max( a, b )
if a >= b
then
return a
else
return b
end
end
多返回值:
function maxmin( arr )
if #arr <
then
return nil, nil
end local max = arr[]
local min = arr[]
for i, v in ipairs(arr) do
if arr[i] > max
then
max = arr[i]
end
if arr[i] < min
then
min = arr[i]
end
end
return max, min
end max, min = maxmin({, , , , })
可变参数:
function average(...)
local sum =
local args = {...}
for i, v in ipairs(args) do
sum = sum + v
end
return sum/#args
end print(average(, , , ))
运算符
算术运算符
+、-、*、/、%、^(乘幂)
关系运算符
==、~=(不等于)、>、<、>=、<=
逻辑运算符
and、or、not
其他运算符
..(拼接字符串)、#(计算字符串或 table 的长度)
字符串
字符串的常用操作
-- 字符串全部转为大写字母
string.upper("hello") -- HELLO -- 字符串全部转为小写字母
string.lower("HELLO") -- hello -- 替换字符串
string.gsub("tooth", "o", "e") -- teeth 2 -- 查找字符串
string.find("hello world", "or") -- 8 9 -- 反转字符串
string.reverse("Lua") -- auL -- 格式化字符串
string.format("%4d-%02d-%02d", , , ) -- 2016-01-01 -- 将整型数字转成字符并连接
string.char(, , , ) -- abcd -- 返回第一字符的 ASCII 值
string.byte("ABCD") --
-- 返回第四字符的 ASCII 值
string.byte("ABCD", ) -- -- 返回字符串长度
string.len("lua") -- -- 返回字符串的指定次数的拷贝
string.rep("abc", ) -- abcabcabc -- 拼接字符串
"dead" .. "line" -- deadline
数组
实例:
#!/usr/bin/lua array = {"a", "b", "c"}
for i= , #array do
print(array[i])
end
输出为:
nil
a
b
c
在 Lua 索引值是以 1 为起始的,如果知道的索引没有值则返回 nil。但是也可以使用 0 或负数作为索引:
#!/usr/bin/lua array = {}
for i= -, do
array[i] = i *
end
for i= -, do
print(array[i])
end
输出为:
-2
0
2