本文是《Programming in Lua 3rd》读书笔记。
Chunks
一个 Chunk 就是一组被执行的语句,例如一个文件或者交互模式下的一行。
标识符(identifiers)
我们应该避免使用以 _ 开头并跟上一个或者多个大写字母的字符串来作标识符,它们被保留作特殊的用途(例如:_VERSION)。
注释
单行注释使用
--
</div>
多行注释使用
--[[ 和 --]]
</div>
类型简介
Lua 存在的数据类型包括:
1.nil。此类型只有一个值 nil。用于表示“空”值。全局变量默认为 nil,删除一个已经赋值的全局变量只需要将其赋值为 nil(对比 JavaScript,赋值 null 并不能完全删除对象的属性,属性还存在,值为 null)
2.boolean。此类型有两个值 true 和 false。在 Lua 中,false 和 nil 都表示条件假,其他值都表示条件真(区别于 C/C++ 等语言的是,0 是真)
3.number。双精浮点数(IEEE 754 标准),Lua 没有整数类型
4.string。你可以保存任意的二进制数据到字符串中(包括 0)。字符串中的字符是不可以改变的(需要改变时,你只能创建一个新的字符串)。获取字符串的长度,可以使用 # 操作符(长度操作符)。例如:print(#”hello”)。字符串可以使用单引号,也可以使用双引号包裹,对于多行的字符串还可以使用 [[ 和 ]] 包裹。字符串中可以使用转义字符,例如 \n \r 等。使用 [[ 和 ]] 包裹的字符串中的转义字符不会被转义
5.userdata。用于保存任意的 C 数据。userdata 只能支持赋值操作和比较测试
6.function。函数是第一类值(first-class value),我们能够像使用其他变量一样的使用函数(函数能够保存在变量中,可以作为参数传递给函数)
7.thread。区别于我们常常说的系统级线程
8.table。被实现为关联数组(associative arrays),可以通过任何值来进行索引(nil 除外)。和全局变量一样,table 中未赋值的域为 nil,删除一个域只需要将其赋值为 nil(实际上,全局变量就是被放置在一个 table 中)
type 函数用于返回值的类型:
print(type("Hello World")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type(X))) --> string
</div>
在 Lua 中,任何的变量都可以保存任何的值。
table 使用简介
使用构造表达式可以创建一个 table:
-- 创建一个空的 table
a = {}
-- 创建并初始化一个 table,这里
-- days[1] == "Sunday"
-- days[2] == "Monday"
-- ...
days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }
-- 创建并初始化一个 table,这里
-- a["x"] == 10
-- a["y"] == 20
a = { x = 10, y = 20 }
</div>
使用 [] 操作符访问 table 的域:
a = {}
k = "x"
a[k] = 10
a["x"] = 20
print(a["y"]) --> nil
a.x = 30
</div>
注意,a.name 的语法等价于 a["name"]。
table 可以用于表示数组,这时候索引为整数,并且从 1(而非 0)开始,例如:
a = { 'a', 'b' }
a[1] == 'a'
a[2] == 'b'
</div>
长度操作符可以获取 table 数组部分的长度:
a = {}
a[1] = 1
a[2] = 2
print(#a) --> 2
a.a = 1
a.b = 2
print(#a) --> 2
a = {}
a.a = 1
a.b = 2
print(#a) --> 0
</div>
表达式
算术操作符
1.+(加)
2.-(减)
3.*(乘)
4./(除)
5.^(幂)
6.%(取模)
任何算术操作符都试图将操作数转换为数值类型,例如:
print(10 + '1') --> 11
</div>
关系操作符
1.<(小于)
2.>(大于)
3.<=(小于等于)
4.>=(大于等于)
5.==(等于)
6.~=(不等于)
两个不同类型的值是不相等的,例如:
nil ~= false
</div>
table、userdata 类型是通过引用进行比较的,例如:
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
</div>
这里 a 和 c 引用一个相同的对象,因此 a == c,但是 a ~= b(即便 a、b 内容相同)。
逻辑操作符
1.and
2.or
3.not
逻辑操作符有返回值。对于 and 操作来说,如果第一个操作数为 false 时返回此操作数,否则返回第二个操作数。对于 or 操作来说,如果第一个操作数不为 false 时返回此操作数,否则返回第二个操作数。
连接操作符
字符串连接可以使用连接操作符 “..”,例如:
print("Hello " .. "World")
</div>
连接操作符试图将操作数转化为字符串,例如:
print("number: " .. 1)
</div>
语句
多赋值(multiple assignment)支持,例如:
a, b = 1, 2
print(a) --> 1
print(b) --> 2
</div>
多赋值的一个惯用法就是交换两个变量的值:
x, y = 1

