| Lua基础语法(详情可查看Lua程序设计.chm) | 2 W3 \# B# p6 B \. q o6 G, q1 u
|
$ S" y% ^- Q" ?- ?% x |
' Z- O$ P9 ~) t9 {7 _ R) [ N
|
- h* b" G! O% J3 A |
- m0 H5 ?9 a: P4 Z7 N1 ~* |& E* ? |
| 保留字(每个都有单独含义) | and break do else elseif
( N3 S. y& q9 ?9 X Send false for function if
2 M: G6 _5 d+ I, H/ U; Win local nil not or/ y+ i% Q$ r8 H4 _/ c& t1 ?2 p
repeat return then true until& [" u' s [- S7 L5 ^
while | 5 y$ B1 P, C1 b
|
| 注释(注释后代码不会执行) | 单行注释:--
& G" M8 V, `( b; I/ b
7 ~2 Q: i1 K6 ?- B5 s多行注释:--[[ --]]% ^7 N* i1 E K+ w" C5 P
! r' M& E* o! C
| 如下:, }8 R* c) W y% J# m! Q, y. c
--[[7 {5 Z+ d% T5 {
" d& W% Y* `5 g7 yprint(10) -- no action (comment)# ~6 W# C- D& m3 s5 b
4 I* v2 q. A4 p4 I" Q
--]]
" h0 |3 u/ x, {& A. Z$ t$ p; W |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。
8 [% v2 T8 h# W9 L8 a! }7 G+ r+ `5 ]! D6 `5 ?3 Q6 B! H
| " S) @: g# p `8 }
|
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。7 {; ^ u4 I+ l. d
| }+ U& q8 ~2 F, ]
|
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:! A4 S0 k+ I. a0 r% i
) O, d |- q- \$ v# t
4 0.4 4.57e-3 0.3e12 5e+20
" @" r5 R- H3 Z& _; k8 l5 W$ m |
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:
2 H4 B I6 ]+ B5 v7 b w- i; m' ?0 H: ^, m4 I7 O
a = "one string"5 {) N- ^& D, j
( @% z4 s$ E, P0 b4 i' \
print(a) --> one string
3 j) A7 r) V+ H$ ]* x) o$ w' g0 q& P |
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:
1 [: W( k, d5 ?* z: N( ^/ ]
9 o% h9 v/ {/ D; B- ufunction 函数名(human)# J* \% m* i1 z2 @: X: R% {0 m
return 1 --返回一个数值:1. [2 w# g* j) M3 M
end( }( h4 I- F l$ m# z1 ~
|
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)
% X, o2 H; v" R- E2 F8 ~$ G8 i# g, `$ Z0 Y
一元运算符:- (负值)6 h l% F' s. }+ o8 }8 I
* j7 O. ^, H/ F8 C这些运算符的操作数都是实数。, `/ t& b4 q- P: h7 J( L! W
| % ~3 R+ L: f0 f2 ~
|
| 关系运算符 | < > <= >= == ~=
: m2 {, U8 H9 _
& f0 o6 I: u, a% @7 N+ o这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
, x, Y/ t4 c8 K' z | a = {}; a.x = 1; a.y = 0$ v1 [/ V4 z7 [; v
/ x( X, x2 m" o4 \+ o2 N/ d5 j
b = {}; b.x = 1; b.y = 0
q7 D& Z, Y0 g- d- {& P- x
: X" u3 h+ S4 t: E9 Oc = a" n1 d/ D" N; q7 C( O7 I5 V( n
9 ~: `$ X( m; p' m. B) ]
a==c but a~=b
( j y4 M. P! b/ S- f5 L |
| 逻辑运算符 | and or not: _- n' r5 [) N
; c1 t. Q$ H* T0 ^& J/ c
逻辑运算符认为false和nil是假(false),其他为真,0也是true." e5 J. E& W+ `) Y, t! [
9 I- t: R( C7 n# ^
and和or的运算结果不是true和false,而是和它的两个操作数相关。9 l+ \: @8 S y- Q* d& m
H; D/ i. D- W
a and b -- 如果a为false,则返回a,否则返回b6 s# T3 @6 ^& M; E k) o
0 i+ t5 ^. a3 n6 a, F
a or b -- 如果a为true,则返回a,否则返回b
& P! C, r& B6 n3 y | 例如:5 U) L* a7 J( h: u
4 k: l3 E5 H! }print(4 and 5) --> 5
+ \% L1 s5 R# n* f* l$ V* p8 V. M1 y5 f/ |. l6 N+ Z
print(nil and 13) --> nil* } P) B) g/ _
% W3 m8 ?" u8 b& K. H7 w+ H0 Kprint(false and 13) --> false
7 ]5 [( f# `! a# d4 n' p/ k2 f
print(4 or 5) --> 4
% U3 y! ^5 C7 J% ^) a8 E
' a b* u8 A Y ~# c/ R$ Nprint(false or 5) --> 5
' H. k' W2 x( p3 u$ W5 I: C |
| 连接运算符 | .. --两个点
7 w* h+ z% P9 d
/ A+ a$ u& `& p" p3 F字符串连接,如果操作数为数字,Lua将数字转成字符串。& c5 q; S0 ]+ P, \1 h7 l/ @
| print("Hello " .. "World") --> Hello World
+ I5 z" Y0 S- C! D' D! c7 E$ Q1 D3 f6 M' A1 l: k8 T* I" K
print(0 .. 1) --> 01
. o V$ y# _, t2 v, M |
| 优先级 | 从高到低的顺序:
9 {+ N9 V% q: [/ @5 w8 i/ U7 q^
& {1 s) Q0 Y4 {- Q# B) Pnot - (unary), y6 z; s3 o. K' S
* /. B% |0 l! h+ c
+ -* [( m) V1 `) ~& p' i7 o
..; F; u; Z& l% j* f. G' A {" X9 D
< > <= >= ~= ==9 ]3 E" t% L4 t
and5 i, [: O7 t' S9 Y
or | 0 ?5 q3 `1 P9 T
|
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
, k8 R3 F& ^7 u7 W6 ?2 ^" H7 A* O' m+ a0 Y6 g. I8 ~
days = {"Sunday", "Monday", "Tuesday", "Wednesday",' a6 W; \8 b- m
& d: Y6 u" j% b9 ^$ H2 M2 Y
"Thursday", "Friday", "Saturday"}5 }' q4 z- a6 `8 p
+ o- X1 S3 O5 J3 E! O2 b! [* Dprint(days[4]) --> Wednesday" A* J* t+ s% v9 H$ S# L
, O7 o+ s6 s4 d/ W
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
: ?. v k$ @5 h$ O4 S& J8 A' G
[! V# q6 R) G/ F% |" Bt.n = t.n + 1
. q3 \4 S8 B4 B2 p' ^% q |
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
5 j0 S8 [+ m8 o: r. n/ t | x = 10
) X, Q: v4 E. E1 q6 {' s( U. T' K0 G- E$ Y p: H5 o
local i = 1 -- local to the chunk
' d& {0 n# V; b( t" V3 h+ u: F: t5 g* T
while i<=x do
$ b6 F3 I9 i, ], z# Q8 j4 B
7 ~& o' b* P# @$ z0 z$ C4 G- s local x = i*2 -- local to the while body+ Z8 A1 V& N0 d9 T* ?
$ P1 N$ f9 |# d8 p" N
print(x) --> 2, 4, 6, 8, ...+ w( J! [3 N+ j
' k. U9 S' Q7 @
i = i + 16 w5 `$ [ T* w R s8 f" v
8 c5 ~3 \6 i! f% n, j! `- ?. Z
end
0 r2 G0 V U$ V |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。7 }! e! U0 U1 r5 [0 x$ o
| if conditions then
x( W; V5 d" j
& z8 E* K4 x" x7 H% H then-part
4 f6 c1 r/ r7 e$ F
* ]1 ]8 D, K7 B" l; @) k' Yend;
! q$ w2 e# S, f7 j5 L6 P
( Z, k0 ` _1 i! W" K% G' aif conditions then
" V9 ^& y& z% R P% x+ L1 Z" e9 v* ^! V& V
then-part
1 o, D9 A$ C K1 j
2 m6 }! w7 U# F4 f' `% Z- ielse& u7 ?0 ]' y7 t: F q
H! I$ N9 m/ Y1 Z! `; z/ U# k
else-part
4 c* {& T2 [6 z% A2 C: O; P, r. S/ D* A
end;/ d1 _9 }- D/ K6 M
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。( U# j3 j7 B8 n! U
/ I; h: ]+ c( E1 z, {9 f- @6 dreturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。8 g4 l+ U( o/ l( m7 h+ J' X
( W: I* n* B. K" n/ JLua语法要求break和return只能出现在block的结尾一句。 | 例如:! z+ q1 J/ g+ D$ X; {' o
% W+ P& A: Z5 b& q d, plocal i = 1
8 ~5 P7 W; v5 _( s) G* v1 x; k" _4 `( t! p
while a do
( R% a$ K; A8 B& P/ }- H5 d
" j$ p0 l# I6 o8 V if a == v then break end
: c z6 w; R( N. a
: D9 c) E/ e% {6 e i = i + 1
7 t0 _' K9 Q, m, o) _
/ {9 a$ f- K9 R' u2 T% G$ n3 Z! vend
0 c+ @; ~8 x/ n6 \6 a9 x3 ~ |
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
& }& C! _! w" Q1 r | 语法:, n& Y3 e" _- A3 F& J
& R8 U( @( Y. M5 Z/ V7 d
function func_name (arguments-list)
8 }+ K0 @/ v5 q; F: G, j6 j$ O
/ z% T' B) N4 i$ D; h statements-list;
/ N' v; K9 o9 o5 f( a4 |# L, f+ C3 x- ~7 q0 a
end;
1 u5 Q7 `1 G+ X4 ~) J* W& J, w
8 |0 z. l- x: U& }6 `) [1 K |
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)' J' L" U; o2 C: E2 k2 `
- @7 D# d+ r8 _" a3 e1 ^1 Oa = math.sin(3) + math.cos(10)
6 i8 k# ]& A$ f6 I8 `" {# t: g( f2 t8 u
print(os.date()) |