| Lua基础语法(详情可查看Lua程序设计.chm) |
: `2 s+ r' B. O5 M |
/ P( I. o. W) c, z& W |
) t; Z2 t% n* n6 v6 t( S1 D: \ |
% s) ?: O6 j1 A |
0 O$ N r8 m$ _, F$ p, l5 Z% ]3 S |
| 保留字(每个都有单独含义) | and break do else elseif# `- X" Y5 `9 q9 W# G0 b
end false for function if# t" c5 _0 y! b {8 |1 u7 @
in local nil not or4 |2 [' s' r* k8 O7 Q x+ _+ Q# L
repeat return then true until4 M# Y# P0 z2 r
while |
$ y! @2 c Y9 R+ u* Z' O4 \ |
| 注释(注释后代码不会执行) | 单行注释:--8 N2 a, h0 F" x5 z% D N6 z; a6 ?
# l: Q+ }; J4 S9 O多行注释:--[[ --]]: h* y; ]& [4 k, }
. q3 B$ C6 z" t W* b" [
| 如下:
# Q( m% F( b& h+ E! t) i--[[
. R" K; q, A4 K& B8 ?; @: Z
9 W. y. B1 _, O1 I, aprint(10) -- no action (comment)- d1 U8 t0 g9 {& s, n* X- Y8 ~
* `8 Q6 a) Q' ~--]]
( p/ e' t( l+ t; ^! g( p |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。: c' U, k4 D2 T+ ]8 L8 l
. T m7 E. p$ { G% A" G; j
|
$ N V* w" L) L/ z t' b6 y |
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。
( ]. @+ G1 V5 ~ |
2 d' K9 L; ]& A3 L |
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:
* [& d4 x6 C* k- Z1 \/ D& M+ ?6 u1 a0 d! w
4 0.4 4.57e-3 0.3e12 5e+20
4 a( B9 x# P9 N4 B |
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:# h; j2 l5 L/ u9 P
% D: p: h3 [* Y) sa = "one string"
4 n* a8 d; c, E$ `2 |0 ]3 e; ^ H0 M$ d. ^) r! {+ P8 F B+ r6 R R/ G
print(a) --> one string
1 V7 ~& ?! j# } |
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:. G& F: S( V9 [" L+ u, n8 U, A+ [
/ _& E# k& c/ e& |' Lfunction 函数名(human)/ O7 L. H' m2 y% }) w! G$ [
return 1 --返回一个数值:1
) n, I9 N5 K+ Fend6 A% ]! e# I: I
|
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂)+ j7 q7 Y7 v: E- f( a7 H
$ K% i8 c! ?) f2 V/ @ ?8 m6 @一元运算符:- (负值)
; u! r' b2 Z1 \) g" I/ N S
& ~- {& A# A- D: Y" g, J; V, Q这些运算符的操作数都是实数。
1 f" Q" a" u( O4 m" g- U3 p! J | 4 w" |" n) T' \/ _1 q
|
| 关系运算符 | < > <= >= == ~=
/ ]" g7 ~8 k8 X3 R; ^# C2 v% J; Q7 h% u* r5 a' Z" d% {+ I
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。2 p( V9 e& w5 ~, o$ {! f
| a = {}; a.x = 1; a.y = 0
5 e) k. E: R- n4 \3 B7 V/ G9 \/ P* a$ ]+ c
b = {}; b.x = 1; b.y = 0$ c# r" f8 A5 i/ l$ N5 S
* v( p- s. e) S' v& j# V0 ?+ Cc = a @) g9 H& s! m& E
) W" r: F0 C3 Z# t( ra==c but a~=b
; q7 \, S3 D2 t7 |8 R |
| 逻辑运算符 | and or not
2 ~6 y: \% Y+ j1 M' e; Z3 E, ]' e9 x4 { ]: j" F* [, n
逻辑运算符认为false和nil是假(false),其他为真,0也是true.$ R+ H* X/ x7 ]5 v; z% p
4 L$ ~* l, K8 \! ^' j# W. L/ Uand和or的运算结果不是true和false,而是和它的两个操作数相关。
3 A0 y. V; |: Y9 x2 J# ^3 S* _( S2 `* F& u7 d) S+ U, V( ^& j4 V( ]+ d
a and b -- 如果a为false,则返回a,否则返回b% \. f, ]6 L- v% V: c3 O3 E
$ p- v( W2 t7 k9 K0 M! m; U
a or b -- 如果a为true,则返回a,否则返回b! L. F9 b9 Y+ @7 j! Y( B3 f* y
| 例如:# W5 `- v# X4 F& W. B
& X ^. m; h; J8 K6 F# x) |
print(4 and 5) --> 58 |& e3 E6 L3 O6 k$ g( R Z# d
. I; d, u# W. c" W3 X, U F% _* J
print(nil and 13) --> nil. w: J# V- |! A3 q
" [) G3 r: \2 D
print(false and 13) --> false
' l# V) g2 u9 q5 _% c+ c5 x. \0 H% u% O* I
print(4 or 5) --> 4
' L2 a& G4 P. S, D3 g
2 ~% }% H! V+ y- J: ]print(false or 5) --> 5" M& v' F2 j8 q7 n
|
| 连接运算符 | .. --两个点
/ T( R, s* H" H6 s* u- |3 S) s
0 U# d- ?& P; \4 R字符串连接,如果操作数为数字,Lua将数字转成字符串。
" B8 j$ c R2 B H! M- F( o | print("Hello " .. "World") --> Hello World
1 G1 n5 w' D/ g0 J
1 _& z, X# u5 a; vprint(0 .. 1) --> 01
4 e6 | U6 r: @8 @ |
| 优先级 | 从高到低的顺序:* X6 X& f: e; _% A
^
9 b0 k. P0 h2 V; H' E4 P! T7 ]1 Fnot - (unary)
' s6 l2 ~$ A4 \) h" L# P5 k* h( |* /6 |; ?1 @; A3 U: E* i( Y
+ -
0 b; R# v! H) F, _.., s4 p4 |( y2 S
< > <= >= ~= ==
8 b1 `9 L( F' J4 h5 Vand
, L% M! @3 t& H! ?3 P( Lor |
9 H" c! ~& D, d |
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:
& L7 Q- I8 v' a3 p7 Y
' D+ d" C& y) ^. z3 cdays = {"Sunday", "Monday", "Tuesday", "Wednesday",! \& s8 I8 r; \; ?! C4 m& y
% e& m4 T% c( g% Q "Thursday", "Friday", "Saturday"}6 x5 t: X4 Y! A0 g
- a: r1 L8 M5 Nprint(days[4]) --> Wednesday
) a6 Y8 l7 |% Y/ g1 t+ g1 {% ?" ?6 _& q7 r- f, W
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
8 b8 U! e" d/ x2 R. y3 D' ]0 }5 y/ ?! P1 E! J3 ^9 E# r0 Q) c/ v
t.n = t.n + 12 Z! @2 g5 C5 x& L0 [
|
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。/ i# C+ r) j7 `
| x = 10- ]" M+ b/ M' h" N6 Z7 L
6 a# @, f9 n- ~* Y6 F
local i = 1 -- local to the chunk
G3 c# L/ W/ h* k# P. v, Y7 I4 \
) J: {* Q( q8 i2 N9 N+ Ywhile i<=x do
! ?0 i* s# X1 k) r4 [/ M% Q7 o0 e+ A6 T2 K9 l" S
local x = i*2 -- local to the while body
9 h- m( P# w4 j6 d- E3 g. U+ d4 K* M1 a, {+ l0 |& j# H
print(x) --> 2, 4, 6, 8, ...
% p4 \3 A, J0 P5 ~
( d7 }2 m3 n3 g i = i + 1) m* M4 l& c. k7 V6 n7 S. P
( [* Y0 }4 j' N% b' I! m
end
) ^0 A6 i1 Y( r/ D1 w7 ` |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
7 E, j8 x: P6 C0 a: N k | if conditions then4 E: k7 T1 ~$ V) r1 D
6 G- N0 \2 U9 n& b4 x( V9 T+ l then-part# [. Y( ]4 d: G" z0 X% ?
+ a% P. ^( S. oend;" L& r! G% u/ h5 a: {8 m6 s8 N
- d8 n3 g' T0 y9 F+ o( T
if conditions then! g& R/ l3 f/ c; P+ L4 h4 a
# T7 T7 R1 M8 o$ X) T/ V
then-part
' v k& c5 e$ \
: Y' j& p, d) \9 relse3 s9 }+ X! G( {. j. {' q% O* r, N9 o1 g* j
1 s* g) ?0 q6 N% P1 _
else-part: m4 {, |( H' x! A. Q
; n2 D9 S: j; S1 B" S0 h
end;
0 D% H" W& v5 ^. N5 ]0 w1 e |
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
4 b; Y" E! z( u9 Z- s E
) s6 j7 v+ v, U+ r1 P% treturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
+ Z( d& G5 R7 X7 C' a# t- N* |4 w5 y4 F8 V7 T( A0 T% A8 X/ A
Lua语法要求break和return只能出现在block的结尾一句。 | 例如:
+ e" c3 A+ b9 W2 s( }* l( w
$ b$ E6 @2 n9 P N6 Qlocal i = 19 l @( \6 _% y
' d) p: i8 M$ C: jwhile a do4 y+ O# b" r4 q0 H: U
" K% m5 _* e8 D) T, {
if a == v then break end
* F4 ~- [& A- ?
8 |. I8 `4 l$ [, \9 m i = i + 1
2 c. Y/ d6 R( k) D' `2 }4 }* Z) ?- r: y& ^2 E8 f" M
end
4 l+ J0 u3 G y0 t# _& v( l) `3 d |
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。! y) Y1 A) ]' L3 f; [2 k
| 语法:% v7 f# Y( q3 ^/ X& B
% j4 C' Q8 V; t6 U/ p1 @
function func_name (arguments-list)' Z( L3 G' |2 ]* E0 O. a) ]
2 Z; u) Y, L' D/ V$ {/ Z& e6 g. T a statements-list;
u4 p5 l5 A, H; S9 V3 w4 V/ k5 X8 S8 t, e4 R% C" V
end;* D* X+ k, w9 D' }7 t, M
8 H/ m* O. I" u) b2 E6 ]# k% _( I
|
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8): J7 Z/ ?2 T9 F- j3 ?
# a2 L7 K) h$ n7 V$ y' ?/ ea = math.sin(3) + math.cos(10)5 A: W; D+ `; |5 e) T
p4 q" ~# E1 }2 Y3 v" F
print(os.date()) |