参考
programing in lua
# 注释
-- 单行注释 | |
--[[ | |
多行注释 | |
--]] |
# 值和类型
# nil
- 未初始化的变量值为 nil
- nil 只与自己相等
# boolean
true / false
# number
- 不区分整型和浮点型
- 0 被判定为真
tostring(number)
方法用于将数字转化为字符串
# string
- 单双引号都可以用于声明字符串
'hello'
"haloo"
- 两对中括号可以用于声明多行字符串
[[多行字符串]]
..
是字符串链接符,不同与其他语言+
作为单纯的算数运算符。- 转义字符串未完成
local mutiString = [[ | |
111 | |
223123 | |
]] | |
print('10' + 1) -- number: 11 | |
print(10 .. 22) -- string: '1022' |
# function
lua 中函数是第一类值,可以存储到变量中,也何以作为函数的返回值
# UserData
later
# Thread
later
# 运算符
# 算数运算符
- 二元运算符:
+
,-
,*
,/
,^
,%
加,减,乘,除,幂,模 - 一元运算符:
-
负
# 关系运算符
<
>
<=
>=
==
~=
- 关系运算符返回 boolean 类型(true/false)
- == 比较地址, ~= 比较值
# 逻辑运算符
and
, or
, not
用法对应其他语言的 &&
, ||
, !
,and 优先级高于 or
-- 1. 三元运算 | |
a and b or c | |
b 为 nil 时会返回 c, 正确三目为 (a and {b} or {c})[1] | |
-- 2. 判断真 | |
func1 and func1() -- func1 不为假执行 | |
x = x or y | |
-- 等于 | |
if not x then | |
x = y | |
end |
# 运算符优先级
level | - |
---|---|
1 | ^ |
2 | not - (unary 一元) |
3 | * / |
4 | + - |
5 | .. |
6 | < > <= >= ~= == |
7 | and |
8 | or |
除了 ^
和 ..
外所有的二元运算符都是左连接的。
# 表 table
# 1. 创建
-- 类数组 | |
days = { | |
"Sunday", "Monday", "Tuesday", "Wednesday", | |
"Thursday", "Friday", "Saturday" | |
} | |
-- 类对象 | |
pet = { name = "Misha", age = 12 } | |
-- 混合 | |
foo = { | |
date = "2017-07-19", | |
worklist = { "lua", "csharp" }, | |
pet = pet | |
} |
ps:
- 数组风格是对象风格的特例
{"red", "green", "blue"} | |
-- 相当于 | |
{[1] = "red", [2] = "green", [3] = "blue"} |
- 数组风格下标从 1 开始,可以规定从 0 开始,但很多标准库不能使用
{[0] = "red", "green", "blue"} |
- 在构造函数的最后的 "
,
" 是可选的,可以方便以后的扩展。
{"red", "green", "blue",} |
- 在构造函数中域分隔符逗号(",")也可以用分号(";")替代。
# 2. 读取
foo.data -- string: '2017-07-19' | |
foo.worklist[1] -- string: 'lua' 注意:下标从 1 开始 | |
foo.pet.age -- number: 12 |
# 3. 修改
foo.data -- string: '2017-07-19' | |
foo.data = 20170719 | |
foo.data -- number: 20170719 |
# 4. 删除
赋值为 nil
赋值
- 多变量赋值
a, b = 10, 2 * x | |
-- a: 10, b: 2 * x | |
a, b, c = 0 | |
-- a: 0, b: nil, c: nil | |
a, b, c = 3, 4, 5, 6 | |
-- a: 3, b: 4, c: 5; 6 被忽略 | |
function f () | |
return 10, 20 | |
end | |
a, b = f() |
- 交换赋值
x, y = y, x | |
a[i], a[j] = a[j], a[i] |
- 值的个数与变量个数不一致遵循:
- 变量个数 > 值的个数:按变量个数补足 nil
- 变量个数 < 值的个数: 多余的值会被忽略
# require
模块中声明为 local,并 return
的变量。在其他模块中引用时使用 local foo = require 'foo'
模块中声明的全局变量,只要被其他任意一个模块引用时,即载入到 _G 中,别的模块即可任意调用