设为首页收藏本站意见反馈 国外访客:

 找回密码
 立即注册
搜索
查看: 684|回复: 0

[教程/工具] 龙途传奇lua基础语法

[复制链接]
灌水成绩
17880
95
18382
主题
帖子
积分

等级头衔

ID : 1

管理员

积分成就 威望 : 8
贡献 : 9
下载币 : 382
在线时间 : 1682 小时
注册时间 : 2013-9-5
最后登录 : 2026-6-18

发表于 2026-6-10 16:11:59 | 显示全部楼层 |阅读模式 IP:广东东莞
免责
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())

. p* Q: E4 G$ i9 I2 `! e4 X
免责
今日来客 列表模式
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|蔡州手游 |网站地图 wapmz.com

GMT+8, 2026-6-18 08:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表