| Lua基础语法(详情可查看Lua程序设计.chm) | - `3 d9 T+ X% }- j$ F" F+ o! |( a
|
! y! V% b( y8 [& ]/ ?1 M6 u |
3 Q+ o5 j& W* { q! m8 O |
" Z( O0 C/ j5 y5 a | , e3 M' s8 N' ^9 }- z
|
| 保留字(每个都有单独含义) | and break do else elseif
3 P! @; D! r9 Vend false for function if
% f" t& t) J/ \' [+ {in local nil not or& _6 ?7 I5 ?+ v2 [: I2 ?
repeat return then true until$ Q ]) @" `! L
while |
3 X/ e' ^6 E; h2 T$ R3 k* D( z. t |
| 注释(注释后代码不会执行) | 单行注释:--
$ X( g9 U2 V# l( e" ]; J3 I' G/ ]% ~2 S! m+ j
多行注释:--[[ --]]3 \$ V+ }5 L9 |1 p, \3 h
" X% |- Q$ p5 E ] | 如下:
% k' d5 N5 T$ O- G1 p5 w--[[! H8 X$ ~1 k$ U9 P, t0 m
) N1 N/ k) |# T7 P, i: a+ ]6 wprint(10) -- no action (comment): d0 W3 y1 f6 ]: V, `5 j
3 d. c7 p1 f' \; W, x0 Y Y
--]]) E9 ~/ I& Y* D2 i
|
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。6 f' K( M# H6 g4 a/ c
2 N1 q$ ~2 L" z; I: S5 N
| ' [9 P) B7 d0 A& [! @
|
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。/ X. }: a" I6 s6 q+ U/ r
| ! ~1 N n# Y7 Y% @! ]
|
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:% f( t; [8 h3 e
+ {3 d8 [$ [1 ^2 V
4 0.4 4.57e-3 0.3e12 5e+201 J& A/ {$ ]+ c5 ]% g( [1 e
|
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:: x' Q1 [) F0 U( L
! W4 \$ i" n# j: N1 t: @+ d- n ~a = "one string"
% s+ M5 n# Y* P4 X3 l: p( M' P9 `# i$ V( f/ B
print(a) --> one string
( @0 o3 n" E$ K/ p) F+ M5 c8 z; L5 M" U" d |
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:' d* C- b; U3 x
7 S% z' v9 I) _
function 函数名(human)
7 O3 ~5 T$ U, A+ } Q! q, w) X return 1 --返回一个数值:1
# V0 V! }, a1 b" Q7 m# ]end
- I) T4 ?! F8 k A |
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)
2 C# Y% n3 G5 n3 D9 V
% J5 h7 P6 i+ x/ e% f5 [一元运算符:- (负值)
6 O9 Y5 O2 c+ i# p; l3 U* V0 r9 g( y, g$ f0 O/ J, d* Z
这些运算符的操作数都是实数。5 A, L1 F5 ?$ I/ J( P
| / W! H: ]7 _* f9 l: n% w2 @5 ]2 {7 X# l
|
| 关系运算符 | < > <= >= == ~=
/ k8 X2 p( L6 z5 I6 A( l
4 ]- a+ }6 ?+ S4 `这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
) [" A/ d ^/ h4 o+ @1 V | a = {}; a.x = 1; a.y = 00 W9 E; I) L2 F6 k0 |+ B4 `$ c4 v
+ K$ d0 g# t" i* N! d
b = {}; b.x = 1; b.y = 0; K8 b1 x2 @$ d: d
! d0 @; F3 v3 c& M
c = a
# z1 ?6 t; H; A, _# K3 n- Z) p7 |, t& j
a==c but a~=b U2 R E: _8 P0 A# Q: ]
|
| 逻辑运算符 | and or not
8 O4 a0 g7 A# b6 s% R: J: w, ~# G+ r0 b0 J H, `
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
" l" ~( N4 A9 c+ |
+ G# s& X' k- c8 ~% S+ O4 Wand和or的运算结果不是true和false,而是和它的两个操作数相关。
. J+ _/ o6 [# P/ D2 w+ I$ j$ H' w
a and b -- 如果a为false,则返回a,否则返回b3 i" ]; T }6 B+ I
9 f; J( _) G' K2 {0 W7 la or b -- 如果a为true,则返回a,否则返回b
9 u- @7 r8 R- w# ~ | 例如:! q0 i: m. ]: Q4 }7 ]
" }6 j/ M$ F7 L$ Pprint(4 and 5) --> 5$ t" F5 g( ]1 ?$ R
; O! f' t! `5 e# p
print(nil and 13) --> nil
/ i* |6 X F* i3 @" Y/ o' D" {- J( M& R9 ]9 }4 W( |3 l$ o7 f
print(false and 13) --> false
) v$ o/ P5 E T! E+ }+ o9 _6 `& _9 V& [" ]7 w8 K
print(4 or 5) --> 4. k. Q, |; t0 u' n" @: ^
/ h1 R6 q" |( m7 t0 P a" Z
print(false or 5) --> 5* B/ l/ u8 k+ W
|
| 连接运算符 | .. --两个点
1 D' v/ ^# R$ O4 g l4 x) j
8 k! F) _( f: i' f4 k E字符串连接,如果操作数为数字,Lua将数字转成字符串。3 A0 I0 ?$ L* Y, M3 s' T
| print("Hello " .. "World") --> Hello World4 F+ u3 r0 E$ Q
5 O3 {0 F; X6 u) _
print(0 .. 1) --> 01, s- U/ g/ g& @: |& U
|
| 优先级 | 从高到低的顺序:7 _' {1 o, T0 V4 o
^
' i% _5 [7 t9 Q. K) n+ ~/ v% Dnot - (unary)1 C; Y0 @/ ^1 a0 s, n
* /
5 r/ O! ^, X* g/ U+ `/ P) q5 G9 ^+ -
! U- V- @( ?5 u! A4 P% ^.., b& d# c. A% {! ?; ~* K; j
< > <= >= ~= ==
( P+ D$ b8 B5 I, Land& e4 w# T7 R; x
or | 7 \2 d1 C, i2 t! _1 S3 I
|
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
* ]. I! B; o( o: V5 d- p5 j. D) M+ z: ~. F. S* T
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
3 e$ B. h7 z% g1 U5 ~, z# n$ S; T" ?: l+ k U
"Thursday", "Friday", "Saturday"}7 F: k- E# ]5 [. O6 c& Y
0 o, a* I* U, Y. z( r3 E
print(days[4]) --> Wednesday! N2 k) q9 e1 O, Q3 f" q4 o2 Z% d
& @( I, V" J d; w
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"$ J/ `: l, x1 P2 c( U
2 g% t5 P8 G) R! It.n = t.n + 1
# T3 ]% D6 T! e/ ^" t7 o |
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
. [/ d% |9 P3 G- T7 g9 j# U3 v5 Q, F | x = 10
: G7 H, o2 a! z7 n
' t% G5 L$ N8 @! @$ xlocal i = 1 -- local to the chunk
+ Y0 j M6 |$ {$ c1 V% U5 k5 y) m! u* n! s
while i<=x do
! w! v2 j$ V8 ~2 T2 J) v! u+ F0 |/ C- }' w4 i& A# S, Z
local x = i*2 -- local to the while body
, y/ g( y. r8 q; t6 |5 K) _7 N' n, ~+ Y. t7 Q8 b2 e" A& f
print(x) --> 2, 4, 6, 8, ...- _, `( m& e0 ^
" K7 V$ V5 M" N0 e+ y2 b
i = i + 1$ W' y8 t" p. I# [4 m \
( e) W: E+ B, @6 B) t/ h# A
end
, g* O0 p# }. }/ f4 h4 U |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。: h0 E: m; S/ v% r# D5 c: A: L
| if conditions then4 T: n* L7 T% K6 X+ G& Z
# V, I: y: E1 A2 u then-part
4 q6 q* t5 g [3 y9 d) U8 z4 X/ @1 ^" D4 p
end;, w6 \6 d M6 q/ h7 `
, _# c, F4 b$ x! }, q" Y- jif conditions then/ J- K% V6 J- z& p
% [$ h: T) j, L
then-part
1 H# J2 R5 M' f% U2 Z q, y3 f t6 u, N8 ?% `" t [0 |; Z
else/ m# ^' ?7 m; [) r7 n
+ L( |7 z v7 k. E$ h6 d0 g
else-part
( U, Y1 v; [$ b/ \
) D3 G4 G! H2 f9 K9 Aend;2 x" J8 Y% F0 w# o) T
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。$ t0 I$ }9 k8 M: [; f$ j) Z! [) h* X
1 b/ S( h! o) Xreturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。7 r* k; q: v1 ]% M( T* }/ O8 {
$ g) m) |9 O+ R, \
Lua语法要求break和return只能出现在block的结尾一句。 | 例如:! s; N6 ]) J% U1 ^+ O
+ {. m0 V7 d/ `. m* J. u
local i = 1) H' _. ~, c, w+ n- P
6 c4 p7 U2 s5 U- h( }) `- i6 }4 X# ^( ^while a do+ d: U0 D4 u" g) c
0 u) T( j% C& ?; U" K' B4 e
if a == v then break end
6 H. z+ A. `2 z2 a; t6 ]" v5 z* }6 c9 `/ f
i = i + 1! Y( i( O0 M+ T1 L* d- ?/ T0 A; T: f
$ ]6 Q0 ~# j/ T9 R8 u
end4 H4 `% C% u' o6 s
|
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。( l4 W2 j8 f/ d
| 语法:
) W+ M" K$ l! l4 n& v
0 [5 ?7 f) g8 D+ X" z) @3 t5 ofunction func_name (arguments-list)0 S9 }, ?& i$ q6 f( p
" l- L7 I" y7 j; I% p1 a/ {' C0 `
statements-list;
; F" U7 I0 n5 O+ |' r! Q \* A, N, @1 P- j
end;
t* R; j. ]& J0 k% ?& \7 c8 Y- h$ q; n( F: v! p: i0 b9 V
|
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)
( ~) W3 S8 y2 W6 W, S- p5 ^5 V# B
$ r* n0 l! j I9 s) j& o- q" ta = math.sin(3) + math.cos(10)
+ t) ^$ {- i- z4 p: ?
3 H5 }3 }7 @% G$ _print(os.date()) |