| Lua基础语法(详情可查看Lua程序设计.chm) | ' T4 B" ~& m8 E' j' |4 f' o, `
|
5 y9 Z; ^' q2 c4 w2 O8 X |
2 Z2 S1 |/ D8 L# B# a4 _
| % ]! R4 j9 [: e
| $ g+ E9 k, `/ b/ o: l" s6 l% v$ e
|
| 保留字(每个都有单独含义) | and break do else elseif
. ]& d1 M. u- Q* ?+ Eend false for function if6 A1 h% b2 F+ Z
in local nil not or
" ^; @# }; _ ^' Yrepeat return then true until
- Q; {5 ]/ t% ]while |
% z( Y) t& h7 i2 U |
| 注释(注释后代码不会执行) | 单行注释:--0 y' h8 b& Q1 J5 ?) }/ t! l2 f
, t! ?6 |/ ?+ C' F3 a多行注释:--[[ --]]
2 @1 y+ N- Y- u3 C. G3 H6 e' `# g8 O
| 如下:5 G8 N$ \+ z& ]4 i/ c( t, s* Y( O
--[[. F0 r( R, K* }2 w$ L$ U
" V, o4 B- W' u' D$ [print(10) -- no action (comment)" X( A( Y4 d1 Y$ }
/ _# j# \' M( k0 [$ N9 r9 X2 \
--]]6 N% R3 S+ U% P9 Q7 S
|
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。
" T) b- d! y# B" O1 Z8 L& \* h0 k
& U: a3 f* [/ g4 g3 z2 g" k9 D | ' {1 C+ H& }; o7 [) \
|
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。- {% [2 `$ a& _, C7 a
| + A/ j4 u3 i1 `+ e2 L
|
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:
' F6 |& J6 ?3 c( l# F3 P8 |+ f2 K" `. H5 Q
4 0.4 4.57e-3 0.3e12 5e+20# T3 k2 ~1 Z3 W9 M8 j
|
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:
6 }: @( g) M3 n( k! D9 L/ y. H2 M$ J6 z( h
a = "one string"
$ N3 G$ Y6 F: v. k& A7 Q6 G: u; t w3 |' [. ^
print(a) --> one string
" I$ [' Q7 b, w" i9 m; F: J( ~ |
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:
$ R# U: k. }/ ]
4 G, _) |) r8 |4 x2 z ]function 函数名(human)
+ ?6 {/ h% D' h) I return 1 --返回一个数值:1
! C: G; b# ]' C4 l! J0 s# gend
/ ^/ f; ~4 w% B% H |
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)7 G! N: U& Z/ w8 J @
- r$ ~2 [; O* C1 ?* M0 r
一元运算符:- (负值)3 b: E0 P% x7 b0 C- M2 C7 F
7 k6 n# d- T( |8 ^ q4 ]这些运算符的操作数都是实数。
6 M4 C m8 c7 v) G6 s7 t |
3 o' d5 o' x# Q4 G5 I6 Q |
| 关系运算符 | < > <= >= == ~=
. B! V. z/ i2 V n* O. e d
+ B+ i6 E9 O' b5 \7 G" e* B, z这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。3 u [8 R0 u( ], d* K4 H t f
| a = {}; a.x = 1; a.y = 07 t& ?# l3 \( a$ \. w3 T
% y: V, ~2 l8 T6 w( E, a' gb = {}; b.x = 1; b.y = 0
3 W5 K# s9 n3 }/ I# u& L; h" k
0 P! {" O' @$ }' N! A* }& fc = a
' W8 ?9 e. O& w; D* u( ?
" ^6 ?2 W# l l& `" Y* P. ?; d" la==c but a~=b3 Y$ f/ `* \5 D3 A
|
| 逻辑运算符 | and or not
% @. E* w X5 n; A, ]8 }8 @# b$ M
逻辑运算符认为false和nil是假(false),其他为真,0也是true.: |0 f' U! A) K0 O9 G! L0 a
- S4 h, j3 ~ B! @8 hand和or的运算结果不是true和false,而是和它的两个操作数相关。
2 e, U! E: }/ ^0 l+ \1 D# o. e' N ^$ K) v
a and b -- 如果a为false,则返回a,否则返回b
. |4 X& q: Z' ?6 j
4 f0 y- H2 ~6 D! t5 l$ Ma or b -- 如果a为true,则返回a,否则返回b7 Y5 V8 T9 }+ _* N
| 例如:' Z9 M4 U- o, h% X! e* H- P# [
- ~% u* Z$ I; c& @* N" n
print(4 and 5) --> 5
4 F' ~* W' a1 C9 a: i- ~# N u% x8 I2 `5 L, u4 G1 d2 k
print(nil and 13) --> nil
, p* V, A: M6 {7 a* Z# [; D( ^, K& F6 y6 X, i( }2 a
print(false and 13) --> false
* |' ~+ \. }, W! w' ^1 s m& s$ X1 P3 H
print(4 or 5) --> 4
. \7 [% l7 @ h9 x" ^% J3 X% @9 I' L0 e7 M: C& u, y3 `
print(false or 5) --> 5
% B# @1 Q' {0 m4 i# n% A9 U |
| 连接运算符 | .. --两个点0 G; z% S4 h# `6 \+ Y
4 Z4 i+ M/ t. f `9 ~% ?
字符串连接,如果操作数为数字,Lua将数字转成字符串。2 q v& J$ O4 G [4 l, D, ^
| print("Hello " .. "World") --> Hello World
: o) ^3 B2 p) O4 N( |
$ y) j! Y6 `) k2 a: w2 Tprint(0 .. 1) --> 018 \' ?# c% d1 u
|
| 优先级 | 从高到低的顺序:
* w- `$ P R: G6 Z^
2 _: v4 b5 c4 S! U" v- K& r5 mnot - (unary), T7 H9 x& f5 v1 M% o& c
* /
9 O: C b! \ Q0 }+ -- s7 }' |% P5 L& _* t/ p: A5 }& ~
..5 |4 h6 u: H, r) k: {
< > <= >= ~= ==
( \ P3 c X5 @8 w Aand- T$ H0 [" z# K u6 L# @
or |
; y; y* B. \- |7 ]4 O& L% T |
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
4 K8 [3 M5 x, X/ D5 w( x9 D6 a5 M" N! X
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
1 L2 G# a7 Q5 u( B" a3 ^( |. t! i4 W1 {; b+ V
"Thursday", "Friday", "Saturday"}
+ w- k9 n; H$ z) ~& E
7 [! p! z3 I, K3 Rprint(days[4]) --> Wednesday
. r6 ? x! ]3 p7 T4 e! S
/ n3 j: V3 `! g% G1 k' [# O( ] |
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
$ r) \5 S' b8 X8 M9 i Z1 M6 h: z) H' L& }1 i2 h* q9 A* b {* d# P6 D
t.n = t.n + 1
' M( T q5 ?' z3 [8 m. S |
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。! K3 \, {8 ]' x* D5 f: _- I
| x = 10, q2 o4 Q+ r$ W4 |3 W
1 v. S5 w& t# u! ?6 B0 n
local i = 1 -- local to the chunk% ~% n7 T, H2 y- r$ _, |. c
; n/ {( H- f6 cwhile i<=x do3 k4 X/ U; j% V( G
& }. O7 W1 G; g, l. m* ?2 `/ T
local x = i*2 -- local to the while body
' C6 [; V+ f* \2 w; s" W- c; T) A& ?. h
print(x) --> 2, 4, 6, 8, ...
+ b) f; ]8 w. b2 X7 W5 n0 D+ f. {4 s. D/ h
i = i + 1
8 f& t. _. I2 b% V' Y% Y# o& }; J( y- u/ }
end/ r, r. g7 |# S& C! }# ~9 w7 F9 d
|
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。8 ~, ^5 B; q9 \. l* G
| if conditions then
: e* H% t$ _' o; E/ D( K
6 m: s2 B0 v1 T then-part: G$ e4 l) J( h% D( \
7 Y- G+ F1 @% @2 E2 D
end;# J2 w( E6 E" t: _& c+ M
0 u; w$ z; h3 s G f" `5 k
if conditions then
6 C' c9 G1 K0 U" F+ t2 w& y5 {' I% i$ f
then-part; | x4 e$ z" Q# B* P
8 x/ Y4 m0 x/ _2 K: relse
, A8 M/ J8 f! M% ^1 N
" j4 T- a) X$ ^* [. ~ else-part
& O# v d j5 ~! ^- ]
6 k/ h: M9 ?" D% Q9 z* F1 ]( ]. wend; { h. s# o1 {4 S O
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。' o2 C0 T+ X8 I9 ?( C
0 K5 q* r3 }1 X$ U) h( Yreturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
* s0 y6 p- c6 J
- e5 {0 [& z9 \0 ALua语法要求break和return只能出现在block的结尾一句。 | 例如:' X* E/ ?8 Q; d5 _
' V U/ N7 j) g( j. Z! jlocal i = 1
4 F" v/ f% c( T9 |; f$ n7 G5 t
# y+ ] p6 \1 y$ ?' xwhile a do! L( H4 [& I1 E; f' }4 ^; W) G9 @3 n
8 o' A3 r; E6 R if a == v then break end! f4 l9 v7 C, }- s3 h
+ v0 x4 @1 K9 X! r) D) P i = i + 1
5 y B& J2 X1 h) R6 F0 T9 S& a6 V$ W1 @" u
end/ w- Q1 z' ^! h2 s( ?" H
|
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
1 L( r# s9 h; W | 语法:/ f7 i7 A I0 @! `' D
3 b- ~6 R4 X3 r
function func_name (arguments-list): j1 v( j- Z3 y, P4 d+ X
) P7 H4 L8 G: M3 T
statements-list;4 k# W- Y3 n- P! A
& m5 a k% R4 M5 s" C: Oend;
! ]- M4 z9 v/ F
% w7 a$ _5 e1 S, ^) t) P |
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)5 x& @3 P& k6 f6 ]
; r* s% K9 X: H/ q1 ba = math.sin(3) + math.cos(10). l% R7 _) W @0 y+ G- j, i
' K+ \! ~% ^& ^7 I2 a
print(os.date()) |