| Lua基础语法(详情可查看Lua程序设计.chm) |
; w- R2 r; }9 I7 R$ K | - r O# G& g/ T% y( u
|
) i+ b6 F' y9 P. O7 a0 m2 k' D
| t8 I, i6 C% {( m" h
| ) F; t% Z& ]: D& p, U
|
| 保留字(每个都有单独含义) | and break do else elseif
( i8 `5 T# O1 Y4 n: Wend false for function if1 n; _" q, P- a
in local nil not or
+ P' f* L) i5 p* T" @% H2 Grepeat return then true until; e K: @9 ?" M! a( F! L
while |
9 K6 u# F! F/ ?3 s |
| 注释(注释后代码不会执行) | 单行注释:--& B% [% ^4 D) r* G2 B
0 v) C" @! y/ H; `" U& g) |
多行注释:--[[ --]]" b K& S+ c. S' Z7 t
; G7 Q! _0 z$ o# k" b& X8 S( g | 如下:, Q. _1 u; F7 N# c/ P
--[[. I' u% G5 ^+ o9 v3 ]4 m4 b l
( s, C. m1 f" i- ^
print(10) -- no action (comment)
' }% Z; R F$ ]$ s; S* \+ _# r+ n5 V: C' g# h( ?! P
--]]
% f7 U L4 H1 U5 k! G7 z |
| Nil(空值) | Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。
7 `* p- W8 I! Y$ W7 c5 i% |$ @
' a) O% _. Z; r* \! J$ @ | - o3 J& J6 U5 M9 t2 k
|
| Booleans(布尔值) | 两个取值false和true。但要注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。6 y t" O( Y5 z$ a: m
|
* L, q9 L- D# [( Y |
| Numbers(数值) | 表示实数,Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此,用实数代替整数不会有什么误差(除非数字大于100,000,000,000,000)。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用长整型或者单精度浮点型代替numbers,在一些平台硬件不支持浮点数的情况下这个特性是非常有用的,具体的情况请参考Lua发布版所附的详细说明。 | 和其他语言类似,数字常量的小数部分和指数部分都是可选的,数字常量的例子:6 O' K2 F. O/ e
: n# g5 C" { P! G. B1 k7 k4 0.4 4.57e-3 0.3e12 5e+20
, r5 R5 M4 d3 m1 m1 R' A |
| Strings(字符串) | 指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串 | 如下:
6 M6 r' q' I0 B, P& c. W7 }4 @" {5 q
a = "one string"# V0 c0 y- I1 F9 D( I7 y( M
) N& Q* e: E. N+ f, ]
print(a) --> one string% ]0 {) E# G W" {8 X* z
|
| Functions(函数) | 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。 | 如下:
0 W i" Z6 b" `& _0 |2 M& y/ ^0 a$ c/ B
function 函数名(human)& P# U; Z" O: l/ X: c
return 1 --返回一个数值:1/ D& ^- y+ ~0 h! N; f
end) y$ Y& {3 E) |' o$ P# b0 q
|
| 算术运算符 | 二元运算符:+ - * / ^ (加减乘除幂): |0 ], e" E/ p6 v& ?$ G9 [1 D
- @! L$ I9 {. P$ i8 [8 M% Q! u: `
一元运算符:- (负值)0 G5 r+ b+ ]& p1 m
% p' O6 P4 S6 z; q7 l2 Y
这些运算符的操作数都是实数。
, e2 V2 M$ x# C, D | " v! L' j1 Z: N! V
|
| 关系运算符 | < > <= >= == ~=& P5 I! D; `; Y& Q( J6 e+ q
+ c% {7 N6 F8 N2 o. }2 G4 o1 r
这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
$ H& _- t; S- x8 b( c/ x* M( C | a = {}; a.x = 1; a.y = 0/ \) `$ m- H' }# {) c+ [$ r
+ F; g7 M2 U( ~$ G5 Z7 h
b = {}; b.x = 1; b.y = 0- R; p1 }: P" N) J1 o B" e( G
* }( v# _9 r& x! F9 q0 s, w5 i2 `, Vc = a
3 I8 |8 ~7 c8 O
6 b/ G+ |. z: Sa==c but a~=b6 g9 o3 w: C: h1 f, Q2 p+ ?
|
| 逻辑运算符 | and or not
A. i5 E' Q* y, d" x- T% _# X) {3 U( f# n
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
! r" ?1 n7 |/ N' Z2 \; k
4 b6 G* G& @3 d2 ~" r* ^5 Yand和or的运算结果不是true和false,而是和它的两个操作数相关。
- L" i' m9 |3 e. M2 H# X( a
! e0 \% v s9 n6 C6 i9 x' ka and b -- 如果a为false,则返回a,否则返回b. W% C% P9 S1 ~
6 c+ K9 Z0 p' G( q1 L- ma or b -- 如果a为true,则返回a,否则返回b
5 S* G7 e, \$ e, H1 c8 u; A | 例如:
n* f. r+ q4 z: O
# [9 V+ B- ~- g& ^6 h8 O; b6 _% Qprint(4 and 5) --> 5# ^+ k+ L6 _( P5 r# [9 k0 Z4 W T
1 M& L, g; `- v
print(nil and 13) --> nil
+ z( z5 E, m" k) a# U( `' @. L2 K0 x6 c& S d
print(false and 13) --> false- W) y8 P5 f' s7 a$ a
' w' x7 h% }2 wprint(4 or 5) --> 49 S6 ]: w! q/ H; x8 f
! `" y$ m7 C2 |+ i1 p! D0 wprint(false or 5) --> 57 N8 z" L" Y) V2 v* r& k+ C
|
| 连接运算符 | .. --两个点% k/ V- }2 s! _
! a5 a4 T" T4 ?8 B8 f5 o+ a# a字符串连接,如果操作数为数字,Lua将数字转成字符串。
+ p6 X! r( T- N* ^1 L | print("Hello " .. "World") --> Hello World1 f+ p& t* s- l& J* X- J, d% C
% S0 M" n- b$ N% S) pprint(0 .. 1) --> 01
C& T5 @+ g Z" b* ~; `" j |
| 优先级 | 从高到低的顺序:; E$ _8 }- q# w( D g
^
Y% J4 L0 v1 j8 Tnot - (unary)
3 j: X |* D: I. S* // R! ]" L9 |8 q7 J% a! p
+ -
3 c: X9 W x% u4 Y& e/ ^" Q..: J' I+ _ m9 N+ _8 d' S3 q
< > <= >= ~= ==5 i7 c) ]: N4 q3 |/ E6 x) A
and# p* V' C# l6 g/ i( Y2 x# j9 C
or | $ u) ?4 r& A' I7 f
|
| 表的构造 | 构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。 | 可以直接初始化数组:# {( Q- c2 P4 X ~
. Q: V& n: Z" ?( w
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
A1 w9 S8 D( i: }. M! W. R* |% G% R) ^+ D6 G) `
"Thursday", "Friday", "Saturday"}! }1 S, q3 W* j* O/ l
& h( j" v+ {! w3 _/ J+ ^
print(days[4]) --> Wednesday
3 ^4 j2 G. \! v( |+ T' q& P+ ^) M' E4 q
|
| 赋值语句 | 赋值是改变一个变量的值和改变表域的最基本的方法。 | a = "hello" .. "world"
/ O7 h) R! O3 A0 s
5 S; H' }( M/ ?/ N) P5 x8 vt.n = t.n + 1/ e) c( u4 V6 {+ y: Z# m% j8 @$ Y
|
| 局部变量与代码块 | 使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。) N' y N6 K# u0 F$ F# J
| x = 10
/ M. f8 H9 f1 K* i( h0 r# {' k. w, A' c
local i = 1 -- local to the chunk* s* m6 O2 x! o# O
C" x U) u6 g. l
while i<=x do
8 i1 B* N9 D; x% g9 T# i! Y6 _2 j2 G
local x = i*2 -- local to the while body
7 i/ j) n; c; k, f
1 b ?* {- b+ }0 H+ E print(x) --> 2, 4, 6, 8, ...
' C" S. e, _2 `" \
" w$ X: @( t v4 s. g1 ~ i = i + 1
: ~/ z' k- e. n9 o* }
! ~/ V( t2 a# R# r# F+ w! Dend
. X$ O/ B8 d, [' Z- Q/ ? |
| 控制结构语句(if语句) | 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
% T) @; Y2 @& g. U, q8 ]) X | if conditions then( g7 }: e0 N1 w5 Q$ J4 \
1 q7 G. v6 p0 U* ]0 `: E6 O
then-part2 Q7 L* ~, c. k4 D1 e! T/ z
- W6 h2 |5 h: c3 b8 N' N% J
end;
{1 J9 U. g$ q4 M5 W7 ]. a" Y; h: }+ i+ w) T9 i$ B5 @; q
if conditions then
; _, {3 E' M4 s5 [4 i7 w, v
5 w4 l$ K- c6 ^( ~- w then-part
6 Z* V( f7 P, o5 Y! e+ |
" X# f8 y& U1 m, t, j* Telse# W' t, r' [& `" `) Z/ K
. C6 T# l- \7 t$ b( j2 c else-part# I7 h( m0 `2 Q6 L& P
' E. H/ b( v; N; bend;6 _$ e+ m( T4 L7 i) w
|
| break和return语句 | break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。% H& l# o* j% W1 t% q
) Z! u# P- J- G* rreturn用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
7 Z2 x% _1 j, h* T
1 B. ?/ Z& X* f. ]1 q. DLua语法要求break和return只能出现在block的结尾一句。 | 例如:
, U8 K8 H V, a$ i" c( c; s$ _/ ?! u9 t9 m
local i = 1
( g3 f: L. @% ?, l U0 V! a0 g7 q* ?% ]( ~8 f* E. C c
while a do: o) j; ~9 W+ p$ `& r
0 ^$ {; y% \5 {1 x6 |5 e4 }6 D% q if a == v then break end! K z0 |' w3 `' h
, k% e2 o& F; L4 m3 C2 o: `
i = i + 13 c5 N9 U4 ~5 z% ~
2 f& H! s7 h$ Z- eend( }7 Z% i5 n: B+ P
|
| 函数定义 | 函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
! E B& x: P, w- K | 语法:
# E% y" M$ ]2 {& D* P0 h( d7 O: n/ e+ D* x, {& x; s4 w
function func_name (arguments-list)
8 p0 v' G' u# P
- f2 Y# `3 d2 _; H1 C B, t statements-list;
. |/ b j0 ?6 ?7 H) F& @) \+ ?9 S9 j
end;
8 \. Y* f1 `% ]5 E- |' z9 ~4 m) m, c, `2 g5 t: S
|
| 函数调用 | 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。 | print(8*9, 9/8), l) u/ O2 N( _; {
, F( s' p/ O3 M& U/ N( E" V; J* Ua = math.sin(3) + math.cos(10)! @7 a' k3 O2 C* o
2 D& p# k, K3 f0 m4 X3 Oprint(os.date()) |