| Lua基础语法(详情可查看Lua程序设计.chm) |
6 j1 W: t @, Y1 f& A1 y | 7 K4 z5 a' X) k5 A
|
6 U# n/ |. A5 R7 h+ R. ], a |
% s7 p/ O2 j( r9 _5 U( n | ( W: R) r1 t1 k( C
|
| 保留字(每个都有单独含义) | and break do else elseif
' _( I: E6 t, Z6 E# L Q1 a/ Yend false for function if9 x3 n- Z; }8 g& h
in local nil not or
5 p0 ^8 P. s# q$ n3 |2 m9 urepeat return then true until
- c/ R+ K5 C- g# [" ~while |
- \0 ?5 y# t4 P5 h3 ]( w# o6 o |
| 注释(注释后代码不会执行) | 单行注释:--6 S+ |3 z; E1 c$ d
# ^' }( u5 h6 x多行注释:--[[ --]]4 ?2 Z. a. D2 M7 _ @3 H& \
2 q4 a8 B+ c2 r0 Y | 如下:
0 E# N2 z9 z7 Q* g0 O--[[
. v1 V' ?6 N; z7 K$ J% m
# D2 l; C3 @* c3 Pprint(10) -- no action (comment)
; l& w7 P! X) O- p& u) A% K1 B' n7 ?$ b
--]]
+ H8 M. X; g( M& S! n |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。4 J; ^* L* o" c+ K- W* h' c4 j
. T, S0 Z6 n5 v5 i( o | + f0 l4 b, F4 i5 n+ d, I
|
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。) z: L) T5 ^9 ^% c# p$ {; {# Z* T
|
* c: P& r# y4 h4 A |
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:
2 t$ [. i. f; m: C- F2 O9 Q9 _/ @1 k% F) d. q
4 0.4 4.57e-3 0.3e12 5e+202 h: J- k9 s% N% i8 k6 b$ g
|
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:; V( {8 H) k' n0 Q8 {; ?% w7 f" B
& v; i$ `- M u( c) M, {1 F: P* {
a = "one string", b7 a2 B+ P& I5 D2 T/ @) ^% c" _& W
" R" d; V s- C
print(a) --> one string/ Q ^0 s7 H7 s, I' P
|
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:" i3 w5 X/ W$ p5 ^ K0 A9 c3 v
+ h4 R0 u2 F; }4 x6 C! t
function 函数名(human)8 [" C6 c$ P9 e4 e
return 1 --返回一个数值:10 |8 {$ v# h7 C* `/ x2 H+ [
end
# J1 R1 c0 ]4 a' i |
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)
$ J* J2 ~% K* X9 Q9 P! A1 w+ E
1 V( G4 z4 s) q! ~. t一元运算符:- (负值)
4 ]. g+ D5 R8 C8 y4 \# ^" m2 S& l# P4 o: A7 }4 h
这些运算符的操作数都是实数。
5 ~! V, [1 u) X0 C, @0 R8 }& i |
- ~6 r# c$ g0 g3 i! g( q5 z |
| 关系运算符 | < > <= >= == ~=7 I: q; Z1 B: z( Z2 H- o; s
8 L2 i0 O9 Z* |" P, ?/ E3 t3 [
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
2 W; ?- V3 W; J& w. ^- R- t | a = {}; a.x = 1; a.y = 0
% q, T, U3 U, ^' O7 K w
( \3 ^$ r! }. P2 lb = {}; b.x = 1; b.y = 0% |7 d; _( L$ E* m+ [1 a" A J
1 m# z6 ` [ d! }9 e; xc = a) b6 U z3 G3 c; }
; x+ m8 K/ Z. }- Ra==c but a~=b
1 A6 E# H/ ?7 L |
| 逻辑运算符 | and or not& H' G! l* J; W/ t `
" i: ~, z- T$ ?1 J+ h0 O5 b逻辑运算符认为false和nil是假(false),其他为真,0也是true.
" b$ |$ N. b% C2 ?) ~# O, u2 c6 i" T* p
and和or的运算结果不是true和false,而是和它的两个操作数相关。
6 @/ c5 l! c7 s4 B7 |& b6 O, O' C% i8 Q+ i0 A0 A( O% y5 I' w8 w
a and b -- 如果a为false,则返回a,否则返回b
5 z3 ^+ D& W$ u3 @$ x1 r
' b# \& x; H( v4 W- P1 Ra or b -- 如果a为true,则返回a,否则返回b* \7 L+ L& ~9 Y
| 例如:: q/ `- g2 E, ~& Y6 {/ R1 V3 L
* @& o' _! ~) v# ^+ [print(4 and 5) --> 5
% z& k9 _( `/ a, ~' k7 u, L0 U' @: v& f3 P. I6 ^* ?% o
print(nil and 13) --> nil% W w7 x! d! o6 I
# o; @2 k4 i x6 _: xprint(false and 13) --> false
3 O& X5 E1 z/ ?7 ]" Z
4 S" N( Q9 A- o& Iprint(4 or 5) --> 4
& c" v( O' |0 K5 G
' c2 d+ p1 s7 F, yprint(false or 5) --> 5
9 O: f: z" J& e8 s3 }" @0 |3 l |
| 连接运算符 | .. --两个点
' R5 J) I6 c1 `
" E2 v% s' y: I6 q# q) ]7 S# ~4 P字符串连接,如果操作数为数字,Lua将数字转成字符串。0 z c, i( y: x$ ]9 n! Z8 p
| print("Hello " .. "World") --> Hello World
& }$ e! b( Z1 G( s4 }% ^
) D7 P- k- Q% |* Z0 W9 w& Jprint(0 .. 1) --> 01
: K" D; L5 J6 [" M" F$ @ y |
| 优先级 | 从高到低的顺序:: C+ D% j* y+ l. f3 R* _+ k. t
^
! X! e5 r2 C( p) znot - (unary)3 S3 q) I, s) z
* /* d0 M- I$ J' M) f k
+ -
2 _( q) n" ^, N; b( Q& g# l7 b..
* ]+ ?, U0 l$ H4 s< > <= >= ~= ==8 j; \- K9 e1 ?7 g" h# e4 _
and
0 `& X: d' X- _7 `& Mor | 1 ]$ ]# a1 c0 l" X
|
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
. L3 h! W L: S# ~$ n" l
) @7 H1 }0 |0 q# }; t2 Ddays = {"Sunday", "Monday", "Tuesday", "Wednesday",+ d) D' D; u! L4 @5 f5 I
; q' N' s, w+ r
"Thursday", "Friday", "Saturday"}4 J1 L7 ?$ }$ |) x; r/ }
$ @2 I1 U+ [6 i4 s' P4 c
print(days[4]) --> Wednesday0 n& H- r+ M# \7 M- `# \
' T" {' L/ L6 G6 M6 C |
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"$ \& m% N9 b' t1 {
8 H0 `0 Y1 ]6 ?# N% Lt.n = t.n + 1$ d: \- F% I/ f6 T( q
|
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
+ v- R; H# G ` | x = 10! t$ X7 {" B9 U* G, a2 H+ |
, ^4 f' R0 J6 Z0 w+ P# _* jlocal i = 1 -- local to the chunk
! q/ I' \5 m7 d) W+ N4 o( @
# ?( x: }4 N( D6 v. |4 e! j, ?while i<=x do
$ D* w! @2 M! [! l# R& r
* s- d6 q2 ~$ r- c3 E local x = i*2 -- local to the while body1 _' T, S, M4 w& U7 v+ |
$ J# g6 z! W2 f8 O/ C s) o print(x) --> 2, 4, 6, 8, ...
* T& V# u3 _3 H& w5 P8 _" |9 L( O- Q8 u& n5 `' P' \# R+ j
i = i + 1
& D- H' B5 m' Q( j7 b9 ?- L+ ^$ [, u/ E9 S
end
- L# |+ ] M w7 J; A0 z; Y% ? |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
" G+ h( G# I9 R2 s, | | if conditions then
- {6 S7 D8 I0 C* r r
2 _/ H' J4 {2 l& z8 { then-part
+ m: ]$ H/ ?; Q9 a/ g3 X) k+ `( [: E* `6 V, y
end;, k7 p* ]- [: V$ t: ]- H2 A
8 \( ]9 ?) Z* {/ {- _
if conditions then- W- o+ Q5 X& D8 j! \1 S0 ~% l0 u1 X
, |( _7 I+ I$ _/ T2 i4 k5 T. ^8 w" }
then-part- t* `1 `) A, j% ?0 N# k
, d4 z6 A/ c3 \$ l! V- u' p: k/ r
else8 C5 s% I8 V+ b+ w3 x* z4 X6 ~
5 x; J$ q0 C2 `
else-part
$ h9 s3 ?, r6 S4 o0 @
8 q4 m/ s8 f& B% W* t4 Rend;% W6 Q& h6 b6 d( e" ?7 C
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
2 M1 {0 y" B* R0 [0 `& o. V
5 P( ~' j3 e( }: u' [0 } Zreturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。" [1 U% O: \- a; J. L
( Y2 B' U: V( ?) [% V$ @! S" o
Lua语法要求break和return只能出现在block的结尾一句。 | 例如:* I. o" E: e6 ^. q* c" k( V
/ q& D3 r6 l: U; g) |
local i = 1
9 h0 P6 \* W. o2 q4 b& p0 m7 o, ^* J/ v
while a do
9 s/ t" \7 D2 N. X9 t1 k4 v2 D/ M r
if a == v then break end
. i6 P( y: N4 H# e/ Z4 p% z S) n+ B. E: ^8 q
i = i + 16 v! g: |/ c' K) }5 R
4 c& t/ A# [) o9 g9 M
end
# W" f) T4 ?# D) k& Z* n |
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
$ I8 l: R# K! C, m2 x7 }5 c | 语法:
6 g- Z J6 c: |) V2 u7 r
% I! T. Y6 z& l5 V1 zfunction func_name (arguments-list)3 N! z& G' m4 { C# t
/ D1 g& q5 [; c* d4 s statements-list;
& @7 k& G$ L y r3 f* d
5 H( c/ H; l; Lend; ?' ~! ~/ t3 U8 N; u) f6 X
: l( i* h* c1 x( ?% ^- }; b |
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)
- ^7 G+ J' c& _/ {+ T4 p" x1 j6 a _- h- y- i" A
a = math.sin(3) + math.cos(10)& R" K1 y+ Y! I, f/ {1 B
5 }: ], p7 U a I) ~
print(os.date()) |