| Lua基础语法(详情可查看Lua程序设计.chm) | 8 u# g, T. w) M+ i& Y5 z
| 4 J E( [' t) Y: U# F
|
/ ?6 G8 y5 w1 s! {
| * W+ l; }4 U+ }2 }) q
|
" d( p9 r- ~/ `: e+ h0 U0 ]5 N5 _ |
| 保留字(每个都有单独含义) | and break do else elseif- c+ U7 w% s4 A& N8 m
end false for function if4 W* H( x! `1 [) i
in local nil not or2 R2 @+ T$ M) f8 p' K# l) q3 S! y
repeat return then true until
; I, f- d3 \1 P% K+ b0 `while | % s# U$ I$ Y. }
|
| 注释(注释后代码不会执行) | 单行注释:--, I/ u9 j3 M% S- r( {; q% Y) @+ Z( Q5 H
7 @6 ^ @ T) W1 v3 [7 E
多行注释:--[[ --]]
. B8 e$ K G* @2 G2 {1 c7 L2 y; a4 O0 I: s
| 如下:: W6 U, D9 W& ^
--[[
. N& J3 O0 Z1 I' c ?* L" V% G$ s$ B- ]$ l: T( J! P
print(10) -- no action (comment)
( h, L$ w" M) O9 D+ B: Y' B1 {3 r) z% B+ U; o# Y
--]]
4 [8 y1 w8 U2 Q |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。+ p7 c" ~; b% ~
3 C+ [# J! ]2 P$ ?% A% g |
$ @* C6 I, `) V; u+ M" X0 n5 D |
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。
" `- p' l1 J" R& Y |
8 M( d. N# z' L/ }) H/ e# y1 @" i |
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:; L& J0 t6 A% a) L W5 {
T" v! c, x7 ~: u, A& p( @
4 0.4 4.57e-3 0.3e12 5e+208 b6 S$ F3 @& y
|
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:- j# K+ T, \) V% P C5 t8 Z% q
% K1 I% }& i$ S) E! Q! w7 l, g
a = "one string"( \( h, i6 T# n I1 v- Z8 R/ s
% K7 w$ X% u& T$ n* aprint(a) --> one string' s% j" L: `- w7 H. @6 O
|
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:
/ x. {/ f2 F& G% E( W. W+ B [" i% A$ o; v8 Y
function 函数名(human)
9 P+ E( K( \1 I return 1 --返回一个数值:1
+ c t# q- Y3 Z5 o' A6 B0 Nend6 i; @- Q9 V8 e% \: l; _
|
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)7 h' s* ]1 F9 V% B, K b
) R; A, D# }* W3 s! |; y, I% E
一元运算符:- (负值)
6 m, `+ Z5 u! B) M' ~5 C# p* T1 {9 P# U7 M* A( U2 S( H1 r
这些运算符的操作数都是实数。* l9 c( R7 g% A9 ?. G. ~
| 0 B! m- z2 y/ w& w# `+ e0 B
|
| 关系运算符 | < > <= >= == ~=+ l" s6 R7 h& o
9 J) y2 H) g+ \; c- V0 o& L; m
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。: L9 M* r' h- v5 g4 Q2 C! Z; M7 L
| a = {}; a.x = 1; a.y = 00 @( N4 J& ^; z4 o+ q
8 \ H5 q) S* k- c4 l c+ |2 h5 Cb = {}; b.x = 1; b.y = 0
2 z! j8 H* K' M8 }& s# Z- V, h, I1 g" }: g" F8 j
c = a
, |( e6 a% ]& Z( R; L, g" S* W$ _. U7 ]% u; n
a==c but a~=b c0 B; F1 i7 |4 c, X+ S) u8 \
|
| 逻辑运算符 | and or not ^. v9 M8 Q0 U3 H& w$ o& F
: l& e* w% u/ \$ \
逻辑运算符认为false和nil是假(false),其他为真,0也是true.3 S$ c B! _' H+ y
; r/ M! p* R/ y& @7 ^" N5 }and和or的运算结果不是true和false,而是和它的两个操作数相关。
; ~* |+ o9 }( e" A, ]
- p1 g0 u$ z# P' c- Aa and b -- 如果a为false,则返回a,否则返回b5 P" l& i! F: S _) N1 I0 `3 N1 \
( O6 _4 Y3 V T E% r& k; t0 va or b -- 如果a为true,则返回a,否则返回b: _4 b1 h, Y1 H
| 例如:
$ r- o1 q# R+ U: o; q4 A' K7 |1 L8 t( M+ I2 K0 y" y# h
print(4 and 5) --> 5
3 \4 O1 C5 k# U9 C& [; V
2 r' w6 j* v. n. ~: ^ Q; ~print(nil and 13) --> nil! c- h9 ?) H& {- C" g J
6 ?5 y+ Z# B% M m6 D. N6 l1 eprint(false and 13) --> false4 e8 p( X$ B, }5 r0 x
3 q% j# o+ H3 `) V }/ A! q
print(4 or 5) --> 4
' j, D, h9 ], E0 g3 t1 m% @" ]7 l% Q
% G2 l& l) F' G' f1 s4 J( _$ n2 ?print(false or 5) --> 5
- c" ~! |3 w5 q' F! d$ { |
| 连接运算符 | .. --两个点& S) c* ?2 X7 s4 {2 z
9 i& P$ |4 Y# G- r% P0 i
字符串连接,如果操作数为数字,Lua将数字转成字符串。
$ h# H' [& y. i% ?. A; ~$ }) E. l | print("Hello " .. "World") --> Hello World
9 h- e6 `5 a6 _7 c* w/ k8 p2 t
- e3 z/ }" _; B5 B4 l c& c# R3 zprint(0 .. 1) --> 01) D7 D, W B6 V/ q! t# W9 P, w
|
| 优先级 | 从高到低的顺序:& H: _* X2 F1 A& m+ `" R
^* J7 _+ r8 ~- P6 c+ h7 l% @+ D1 n
not - (unary)
5 S1 w. h8 N- G1 {* /
$ |- E7 X% Y- ?% U7 g& `+ -- T' o! v. W; l8 b: i
..
2 t% C7 }7 a$ }' K6 a% v< > <= >= ~= ==
4 s, S; Z( v/ n. f* ]' J5 gand* Z) k$ E4 u, f( \
or |
3 f5 e* @ `$ Y0 h5 L4 y% p |
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
0 e' K) w' f, m4 e2 o+ E4 s9 o1 y5 b: }! A9 E
days = {"Sunday", "Monday", "Tuesday", "Wednesday", ?6 |& j% `4 ] ]% }! m
: p; M) `( [" J6 A& l6 I "Thursday", "Friday", "Saturday"}" y9 J3 |, q+ M0 C
: Y: c. B, i& p1 ]& q, @- Kprint(days[4]) --> Wednesday
2 V \+ ~( ?, H: M1 x- v j: j' l' v6 W9 J5 z
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
. \7 Z) F' s* j. ?# {: N( Y5 M3 z8 `. u- G! W/ e
t.n = t.n + 1
/ t& f. i: w1 k# ~, t; ^! O A+ O |
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
# m3 A) M& m, V | x = 10
. z/ ]$ |" S4 r$ N+ T( F+ R
* s$ Z7 e& @- r- M4 Qlocal i = 1 -- local to the chunk
: W* v! R# e7 s- c6 E( y2 h+ ]6 {( n4 o1 @: `& r. Y
while i<=x do
7 ?8 R8 ~. {2 ^- ^3 X7 j& c$ ]6 ?+ S! e9 |) Y# g2 V
local x = i*2 -- local to the while body
/ j- j) w- d! E+ [' o
2 Z9 ~3 U, k6 p* v% v print(x) --> 2, 4, 6, 8, ...6 p+ r3 J) Q( g7 k4 `4 c( K5 X
$ Z" _3 q; L$ W% l1 V+ V
i = i + 1. N( [# ?6 i# n1 b) M
: _! P' L3 |% O2 R/ qend) O6 A# Y9 [; \5 G# _$ Y* z# x- Y
|
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
& |+ S! J6 {3 F6 E" K) E! H | if conditions then
8 Y2 `% J6 T5 A1 k- W- `: A" Z$ t/ }9 t0 |/ F- Q- }! K. \! @
then-part9 Y& O8 v" {5 o7 r7 z+ A4 g4 f# ^$ w, S0 G
1 W2 D1 ^0 v; }+ I7 K
end;
6 G/ a5 D6 d8 h% r' }! x; z& R! ~2 ]- p2 s6 m
if conditions then) y8 W% \7 M$ R- m& `& \
# L( N; ]0 ?7 ?- y4 G then-part
' L3 N1 ?" v7 b+ L4 z) ^6 K+ _$ r( [
else% t3 Z4 b( D' i5 [
z8 Y8 u; f, k6 b& Q8 ^( t8 { else-part, F( N3 c; |% L2 S
) a+ s# a, X q
end;3 M% N7 N0 }/ G* i; \& _; g$ }
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
( x: k, n4 S3 r6 B$ D {5 U/ t; R0 r- D
return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
$ N4 ?, c% C+ E! K7 P; ^) o# ]
8 h2 m) L# N/ c/ ` {1 I* e) yLua语法要求break和return只能出现在block的结尾一句。 | 例如:) y+ E" d0 x! u
( ~$ y/ i3 `( D) s0 G- A! d6 J" p5 w
local i = 1- S! |9 D5 U9 M
4 i0 X8 W6 @) x* d6 _" H9 N% l8 xwhile a do$ F* A9 w* P+ F' P1 R, \% `" B- S+ L
6 t6 t0 J5 K r2 {5 y0 k4 q: p! b4 \
if a == v then break end
* ?1 s/ G" r5 p/ ]6 m- u- e% f0 A6 ~2 Y: _3 {, y
i = i + 1; s0 T) I- [0 b, j h* Z
+ W( |1 k9 t. ?+ send/ e/ d3 u' A3 p
|
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
& `: A: N* y6 a( C, P1 F. y | 语法:7 y7 `7 g3 ?( t% f
5 M6 l( Q5 _( J' X' efunction func_name (arguments-list)
1 p1 o y9 J4 _9 G+ `/ X
' w$ l- [" ?4 P/ B statements-list;. b: V; c; l& I7 ?+ ?
5 V# A. c! s/ B3 u% ?
end;2 x! d- I! y% q8 E N7 f
+ {# M% f% O4 _. a* S5 c. W |
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8)
, v( v+ D( ], Y& T% v
( I: f! a# c$ B0 G ra = math.sin(3) + math.cos(10)
" X; J* j8 F) d5 x3 X3 I0 C, |
* _7 a9 b( ]1 {print(os.date()) |