| Lua基础语法(详情可查看Lua程序设计.chm) | + y8 ^! n {; {$ l
|
6 N$ y0 t7 }- _; l2 W ^ |
5 `& x/ k' F+ W# E/ C2 n
| % v' O3 ^' @: G0 L5 Q
|
w: v% ~& p8 q$ j& K |
| 保留字(每个都有单独含义) | and break do else elseif! U, \$ z6 U, A2 a
end false for function if
' A$ \* R/ r7 |$ Xin local nil not or( F4 @( p, n+ D* B) _! d6 Z- w9 X
repeat return then true until4 Q% d6 l/ ~* l
while |
]0 m9 H: m( Q: r( p- V |
| 注释(注释后代码不会执行) | 单行注释:--
7 M! _. ?8 _8 {9 I$ w* ~; `) i, G3 `
, Z. i" _5 T/ |" i/ x0 ?; I: M多行注释:--[[ --]]+ r1 C! _: D' D: V* X4 a$ ~+ _$ u. W
u- ]2 d6 |6 ?8 N4 @7 U
| 如下:
" `% k9 x, X. }--[[& b* X& G" T( ~! I! L
; k o/ _9 c2 v; o0 h7 t
print(10) -- no action (comment)4 p7 E2 L; c8 P: H5 x! g% [
7 m; i3 ^9 b7 r--]]
$ n& f+ L# e' ~ T- ` |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。, c6 }8 }3 m4 \
8 L. F8 ^* X0 [' m# ] |
8 |4 y8 S: H) {4 ~ |
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。
/ ]) ]4 B4 o: ]0 v+ Y |
0 ?( S2 D' j; Q6 `' [ |
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:% u( b2 ^! l1 L& e( A
& g& C1 }! p; X5 {. a4 0.4 4.57e-3 0.3e12 5e+20& p6 X- g# g% ]. y2 A+ z" h
|
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:
6 v2 Q9 M* M; O9 K9 z. `. s8 l" F! _' A8 P8 H
a = "one string"
) R) E3 Z! t- ~* ?: g; R: S# W) @: h# B& J4 A" g7 e
print(a) --> one string3 ^* L% S0 ~" s' _( O1 X; K: m
|
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:
. p3 m% y( f# _) V$ s
+ z0 F+ T; g0 X6 A- M- K1 j# b3 pfunction 函数名(human)
/ r* }) j: D0 ^ _. b return 1 --返回一个数值:1
* k7 v M4 j$ ~* d5 Oend1 z- O6 Z7 { k- m C) r
|
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)5 a& a0 I' {) ~4 j5 e) y
$ T* B7 T2 s1 N O1 ?2 X
一元运算符:- (负值)+ V5 N% @9 ~ `8 L! O; A3 M# H
/ c7 G; m. ]2 a1 c- z这些运算符的操作数都是实数。2 ]; l0 H% ~, y0 O8 ^/ |6 g- {' e
|
. D' [/ K, M' k( R |
| 关系运算符 | < > <= >= == ~=
8 E+ a7 y& V |# A( ~' q R# P( _/ R+ o
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
8 A2 V, b. g8 V" v9 n | a = {}; a.x = 1; a.y = 0* |9 A2 u1 A6 J! Q( f( `# K) R7 S
G2 t2 B( ^3 ]' k& y- T9 ]8 c/ b3 C
b = {}; b.x = 1; b.y = 0
$ T" T7 }, H& p! g5 `/ q4 H$ F
# R5 a( R( ~, y( X: w& Q1 Zc = a
* P6 Q: v, t! ^3 W/ U
: c' U o. Z: q' U; e' wa==c but a~=b8 R7 n w# W1 [; k/ V/ N; Q5 I. A
|
| 逻辑运算符 | and or not1 p9 l* R* S5 j- i$ V% v* G
& m: ~2 i( g ~% I2 w0 B# d2 M) |
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
& {1 t4 O2 `8 n4 f$ e! x9 N! o; G8 _8 q) o# Q/ h6 }' {) l
and和or的运算结果不是true和false,而是和它的两个操作数相关。! t. T/ D9 d1 x/ C
# k) g, N9 |1 j5 {) e& \' Xa and b -- 如果a为false,则返回a,否则返回b
/ d' ]8 g( @" x' ]/ I' i+ P
% h% s! c, {3 I0 k2 Ea or b -- 如果a为true,则返回a,否则返回b
6 X9 Q5 }- @; ?7 G | 例如:" B$ g- a# h% s
4 Q! _( k) C2 c9 j
print(4 and 5) --> 5
1 ~6 l) w8 i8 g/ W1 ~8 A- D
# C+ X0 U% D/ |3 P5 a# zprint(nil and 13) --> nil! A+ b8 { {1 a% B% C; \
1 S+ x8 j# l- D8 [% Oprint(false and 13) --> false" g; o+ C: D" \ L& o( D
9 h" D6 P G! `print(4 or 5) --> 4
7 Q0 o6 w! C0 F5 m: P: J1 p; X) D- r( L' Z- b; p
print(false or 5) --> 5
1 x5 u" _+ c& W* S e# H) V |
| 连接运算符 | .. --两个点
3 N2 n9 x2 ^4 }* i8 @3 \
. U( W* Y) S) f' l% x字符串连接,如果操作数为数字,Lua将数字转成字符串。
) j Z8 Y# ?8 n$ f. e | print("Hello " .. "World") --> Hello World' N; p) t, f# q5 F# f; s, ?6 C
! l8 d! E G0 Q! a/ M8 h; ~9 ~$ Zprint(0 .. 1) --> 01
& J7 k; r# A+ B* F/ ^: Y/ ?' e1 p |
| 优先级 | 从高到低的顺序:
& k/ S! x/ N0 b! W6 X/ y# V^) ]. A6 ^$ o7 B! B9 M" k% X. h. u
not - (unary)
5 Y4 y9 _3 e7 X( K3 k2 ^6 V6 }- W* /# T" ^& X+ V$ l( R
+ -; O z1 a2 b% v. c6 M* s8 b
..
5 _- b! E2 b$ t- T< > <= >= ~= ==7 L% b1 d; R5 X _$ f. C2 c! o
and: H6 S$ }0 p5 y3 @2 H5 b% K
or | 5 p) f0 L- D9 y; R6 `8 u
|
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
$ k: _$ m- L) Y l
n0 H ~) r' k% R9 Hdays = {"Sunday", "Monday", "Tuesday", "Wednesday",8 r9 K7 u# Z6 o9 Z+ x2 ?
) {- D7 p0 c1 p7 `5 d1 | a9 z
"Thursday", "Friday", "Saturday"}
+ P+ |1 Y8 z. k" H0 C6 y
0 k4 i/ o+ @+ `- L1 k9 G% ?4 c4 fprint(days[4]) --> Wednesday- P' r2 X% C1 a+ r1 U1 s
& ~, A- |8 }. n9 Z1 V
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
* n% w! d& Y" F8 Z' B& k3 H9 e
3 g8 Z: `# r8 ht.n = t.n + 12 u' g! Z4 f; W
|
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。0 H( a* ]) a4 M$ ^& f+ F1 U
| x = 107 X6 ?# I* ^5 @$ {$ L+ `
9 ~3 S4 n' B6 Q, M/ ?3 L
local i = 1 -- local to the chunk- f9 u9 \! A1 @8 }/ L% |* j8 M
! Y& G9 z7 @$ N0 |5 fwhile i<=x do5 A r# B( @' u% z& f
6 s4 _4 \5 P$ }/ ^8 B
local x = i*2 -- local to the while body) D6 F0 y2 P' i4 R* G* I
7 h' [1 @; j; r* c8 W# }6 k
print(x) --> 2, 4, 6, 8, ...
H6 A' C# [, d! o# J
# C- G. _9 U8 B9 o/ B i = i + 1
* M- G; T7 D( b& f" l
, g7 ]+ r1 T& \0 gend
6 q$ t [$ k- a; J- [; k |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。8 v ~% X) b/ W( A4 {8 k+ G4 l n
| if conditions then1 \0 v1 h7 x1 @- {3 E' D
# N& Y6 t6 t8 w/ A then-part% x5 g0 d" u( k O
% q) ~' _: {+ N. ]. u3 r; a3 lend;
7 s' X- |/ q( l
) ?) @5 |1 o0 {5 b! hif conditions then
2 a% J+ X5 A$ Y% T4 w1 R2 ~) k
1 L, l7 }+ B+ J" ~/ ^2 y2 R: Y" e+ a/ q then-part
9 _1 o+ a. `0 K9 Z/ H7 n$ ]2 b; |9 y0 v. A: B
else$ p) a6 o: k+ I( R2 P% Q
5 X6 A) k) m3 J0 Z else-part8 z6 c5 |3 E+ m+ w
& r: b; t0 Q: ]+ [+ j' M0 kend;7 n w7 e5 W+ P# L' M& k
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
! Z# I# J5 k- e( Q! J8 K* ]( T0 M0 w
return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。/ n0 S8 W J4 _, {5 Y c. ^
) b3 d- u ]' u+ G C9 U' H
Lua语法要求break和return只能出现在block的结尾一句。 | 例如:9 Q/ A' }& a q' q& a# {) L: [
/ X3 U5 s* Z5 L) [' jlocal i = 1- s) }5 H6 w, b+ t
" k: @: H- ], [4 D# P8 wwhile a do
5 u& F6 j( p$ r u& B1 D
1 R9 d3 g/ @# q! ? if a == v then break end
8 l8 b. \: A' k* S; V9 O5 c2 h" S% L9 `; _. |6 k r. y4 g3 u
i = i + 1
, U; ]' [+ _& ]3 ^, }6 a3 X- G+ X( ^* j4 m, ~
end: \/ {) S8 g6 Q% E4 g! A! H' l
|
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。2 r! T/ \5 S0 l, P2 k' b
| 语法:2 W8 e) H: Y& u2 l& j
+ L3 G6 S, t. M. X$ x/ i+ H! Qfunction func_name (arguments-list)
- ^9 Z, G1 S! g; L9 z' _: o Q5 M9 K, o# D
statements-list;" n4 K. N# D- P
. i0 Y1 ~ R D' O( [! @
end;, @4 j+ S6 x( c. W5 q3 |
& t/ z! Z; _- T- c9 c7 G' \7 Y/ P |
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)' @3 T1 L, z$ T6 W
1 _/ n# H7 t* @
a = math.sin(3) + math.cos(10)) K2 B0 \. G5 b& ~' d
* G1 c& m8 `( @# H U( q3 p4 u
print(os.date()) |