月度存档: 九月 2010

Lua学习笔记(2)–运算符

说明:Lua学习笔记的内容都是《Lua程序设计.第二版》的读书笔记,笔记中很多内容都是来自于书中

1.运算符和优先级

^
not,#,-(符号一元)
*,/,%
+,-
..
<,>,<=,>=,~=,==
and
or

1)从上到下,优先级逐渐降低,除了^(指数)和..(字符串连接)是右结合,其他的都是左结合,本人通常都是使用括号决定运算的顺序

2)算术运算符都可以用于实数

2.%(取模)的特殊说明

1)取模的定义 : a % b == a – floor(a/b)*b

2)对于正实数,x %.1 * 10e-n(n>=0)就是取得x中的小数点n位以后的数字

例如可以使用x – x%1.0e-2来取得精确到小数点两位后的结果,对于负实数则不是这样,可以先取负实数的绝对值,进行之前的         操作,在加上负号

3.关系运算符

1)与c语言不同的有不相等操作符~= 注意尽量不要比较不同类型的值

4.逻辑运算符and,or, not

1)and: 如果它的一个操作数为假就返回第一个操作数,否则返回第二个

2)or:如果它的一个操作数为真就返回第一个操作数,否则返回第二个

3)and和or都是短路求值

4)not永远只返回true 和false

5)技巧,根据 Lua 逻辑运算符的特性可以使用下面的技巧

①x = x or v –如果 x 没有赋值则给 x 一个默认值v 等价于 if not x then x = v end

②(a and b) or c 前提b不为假 则与c中的 a ? b : c  类似,例 max = (x > y) and x or y,解析

根据and和or规则有:如果(x>y)为真,(x>y) and x返回的结果是 x,而x or y 则返回的结果x;如果(x>y)为假,(x>y) and x         返回的结果是 (x>y),因为(x>y)为假(x>y) or y 则返回的结果y

Lua学习笔记(1)

说明:Lua学习笔记的内容都是《Lua程序设计.第二版》的读书笔记,笔记中很多内容都是来自于书中

1.Lua区分大小写;

2.Lua的8中基本类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、  function(函数)、 thread(线程)、 table(表),使用type函数可以确定一个值的类型

1)nil用于区别其他值,用nil来删除全局变量和table中的元素

2)Lua的boolean 将nil和fasle视为”假”,包括0和空字符串都是为”真”

3.Lua的注释:

1)行注释为:

1
--注释内容

2)块注释为:

1
2
3
--[[
注释内容
]]

3.字符串用””(双引号)、‘’(单引号)来包围,也可以使用

1
2
3
4
[[
1
2
]]

包围带格式的字符串,类似于python的

1
2
3
4
'''
行1
行2
'''

如果块中有包含]]可以使用在开头和结尾加上数量相同的等号,例如:

1
===[]===

这种方式同时适用于块注释

4. ..(两个点号)为Lua的字符串连接操作符 ,lua 5.1中, 在字符串前放置#(井号)来获得字符串长度(长度操作符(length operator))

5.table

1)table是lua中的唯一的重要的数据结构机制;

2)table没有固定大小;

3)table可以使用整数和其他类型的值来索引(除了nil);

4)通过key访问table的两种方式[]和. 例如 a[“b”] 和 a.b 是一样的

5)table 的创建,table构造式

例:

1
2
3
4
5
6
7
8
9
10
11
12
a = {}
a = {"one","two","three"}
a = {x = 10, y = 20} -- 等价于a = {};a.x =10; a.y = 20
a["x"] = 10
a[10] = "great"
--显式用一个表达式来初始化索引值:
opnames = {["+"] = "add", ["-"]="sub",
["*"] = "mul", ["/"] = "div"}
i = 20; s = "-"
a = {[i+0] = s, [i + 1] = s..s, [i+2]=s..s..s}
print(opnames[s]) --&gt; sub
print(a[22]) --&gt; ---

6)如果table中的某个元素没有被初始化则那个元素的值为nil

7)如果把table当作数组来用的话使用整数作为索引,与C语言不同索引从1开始,注:虽然可以访问0位置处的值,但是不计入table的长度,可能造成隐式的错误

1
a = {[0] = "one","two","three"}

8)如果table中有空隙即table中间的元素被赋值为nil 则#认为nil为table的结束标志从而导致计数错误,如果table 中没有空隙,使用#来统计长度,否则使用table.maxn来去的table的最大正索引//但是仍然不能处理多个空隙的情况,所以尽量避免把有空隙的table当作数组来使用

9)使用统一的索引方式来操作同一个table的,否则可能造成隐式的错误

10)table构造式创建table时,可以使用;(分号)来代替逗号来区分不同成分,最后一个元素的后面有个,(逗号)也不是错误

顺便做下广告 需要SSH,VPN的同学可以访问 http://www.sshops.net/