Lua 5.1 参考手册

所需积分/C币:10 2015-02-26 16:52:18 857KB PDF
3
收藏 收藏
举报

Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。[2] Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。[2] 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
1 123"]==] 数字常量可以分两部分写,十进制底数部分和十进制的指数部分。指数部分是可选的。Lua也支 持十六进制整数常量,只需要在前面加上前缀0x。下面是一些合法的数字常量的例子: 33.03.1416314.16e-20.31416E10xff0x56 注释可以在除字符串内的任何地方是以两横(--)开始。如果跟在两横后面的不是一个长括号,这 就是一个短注释,它的作用范围直到行末;否则就是一个长注释,其作用范围直到遇到反的长括 号。长注释通常被用来临时屏蔽代码块。 22-值与类型 ua 是一种动态类型语言。这意味着变量没有类型,只有值才有类型。语言中不存在类型定义 而所有的值本身携带它们自己的类型信息。 Lua中的所有值都是一致( (first-class)的。这意味着所有的值都可以被放在变量里,当作参数传递 到另一个函数中,并被函数作为结果返回。 Lua中有八种基本类型:nil, boolean, number, string, function, userdata, thread, and table.Nil类型只 有一种值il,它的主要用途用于标表识和别的任何值的差异;通常,当需要描述一个无意义的 值时会用到它。 Boolean类型只有两种值: false和 true. n和 false都能导致条件为假;而另外 所有的值都被当作真。 Number表示实数(双精度浮点数)。(编译一个其它内部数字类型的 Lua解释器是件很容易的事;比如把内部数字类型改作单精度浮点数或长整型。参见文件 luaconf.h。) String表示一串字符的数组。Lua是8- bit clean的:字符串可以包含任何8位字 符,包括苓结束符(\0)(参见§21) Lua可以调用(和处理)用Lua写的函数以及用C写的函数(参见§258) userdata类型用来将任意C数据保存在Iua变量中。这个类型相当于一块原生的内存,除了赋值 和相同性判断,Lua没有为之预定义任何操作。然而,通过使用 metatable(元表),程序员可 以为 userdata自定义一组操作(参见§28)。 userdata不能在Lua中创建出来,也不能在Iua中 修改。这样的操作只能通过CAPI。这一点保证了宿主程序完全掌管其中的数据 thread类型用来区别独立的执行线程,它被用来实现 coroutine(协同例程)(参见§2.11)。不 要把Lua线程跟操作系统的线程搞混。Lua可以在所有的系统上提供对 coroutine的支持,即使系 统并不支持线程。 table类型实现了一个关联数组。也就是说,数组可以用任何东西(除了nil)做索引,而不限于数 字。 table可以以不同类型的值构成;它可以包含所有的类型的值(除r外)。 table是lua中唯 一的一种数据结构;它可以用来描述原始的数组、符号表、集合、记录、图、树、等等。用于表 述记录时,la使用域名作为索引。语言本身采用一种语法糖,支持以a.name的形式表示 a"name"]。有很多形式用丁在la中创建一个 table(参见§25,7)。 跟索引一样, table每个域中的值也可以是任何类型(除n外)。特別的,因为函数本身也是 值,所以 table的域中也可以放函数。这样 table中就可以有一些 methods了(参见see§2.59)。 table, function, thread,和( full)userdata这些类型的值是所谓的对象:变量本身并不会真正的 存放它们的值,而只是放了一个对对象的引用。赋值,参数传递,函数返回,都是对这些对象的 引用进行操作;这些操作不会做暗地里做任何性质的拷贝。 库函数type可以返回一个描述给定值的类型的字符串。 21-强制转换 Lua提供运行时宁符串到数字的自动转换。任何对字符串的数学运算操作都会尝试用一般的转换 规则把这个字符串转换成一个数字。相反,无论何时,一个数字需要作为字符串米使用时,数字 都会以合理的格式转换为字符串。需要完仝控制数字怎样转换为字符串,可以使用字符串库中的 format函数(参见 string, format)。 23-变量 写上变量的地方意味着当以其保存的值来替代之。Lua中有三类变量:全局变量,局部变量,还 有 table的域。 个单一的名字可以表示一个全局变量,也可以表示一个局部变量(或者是一个函数的参数,这 是一种特殊形式的局部变量): var :: Name Name就是§21中所定义的标识符。 任何变量都被假定为全局变量,除非显式的以 local修饰定义(参见§2.4-⑦)。局部变量有其作 用范围:局部变量可以被定义在它作用范围中的函数自由使用(参见§2.6)。 在变量的首次娬值之前,变量的值均为ni 方括号被用来对 table作索引: var ::= prefixexp[ exp 1 对全局变量以及 table域之访问的含义可以通过 metatable来改变。以取一个变量下标指向的量 t[i]等价于调用 gettable event(t,i)。(参见§28,有一份完整的关于 gettable event函数的 说明。这个函数并没有在Jua中定义出来,也不能在lua中调用。这里我们把它列出来只是方便 说明。) var,Name这种语法只是一个语法糖,用来表示var["Name"]: var :: prefixexp Name 所有的全局变量都是放在一个特定 lua table的诸个域中,这个特定的 table叫作 environment(环 境)lble或者简称为环境(参见§29)。每个函数都有对一个环境的引用,所以一个函数中可 见的所有全局变量都放在这个函数所引用的环境表( environment table)中。当一个函数被创建出 来,它会从创建它的函数中继承其环境,你可以调用 getfenv取得其环境。如果想改变环境,可 以调用 metheny。(对于C函数,你只能通过 debug库来改变其环境;参见§59)。 对一个全局变量x的访间等价于env,x,而这又可以等价于 gettable event( env,x") 这里,env是当前运行的函数的环境。(函数 gettable event的完整说明参见§28。这个函数 并没有在lua中定义出来,也不能调用。当然,en这个变量也同样没有在Lua中定义出来。我 们在这里使用它们,仅仅只是方便解释而已。) 24语句段( Statement) Lua支持惯例形式的语句段,它和 Pascal或是C很相象。这个集合包括赋值,控制结构,函数调 用,还有变量声明。 241- Chunk(语句组) Lua的一个执行单元被称作chnk。一个 chunk就是一串语句段,它们会被循序的执行。每个语 句段可以以一个分号结束: chunk ::=stat [;] 这儿不允许有空的语句段,所以;是非法的。 lua把一个 chunk当作一个拥有不定参数的匿名函数(参见§259)处理。正是这样, chunk内可 以定义局部变量,接收参数,并且返回值。 chunk可以被保存在一个文件中,也可以保存在宿主程序的一个字符串中。当一个 chunk被执 行,首先它会被预编译成虚拟机中的指令序列,然后被虚拟机解释运行这些指令。 chunk也可以被预编译成二进制形式;细节参考程序luac。用源码形式提供的程序和被编译过的 二进制形式的程序是可以相互替换的;Lua会自动识别文件类型并做正确的处理。 242-语句块 语句块是一列语句段;从语法上来说,一个语句块跟一个 chunk相同 block chunk 个语句块可以被显式的写成一个单独的语句段: stat do block end 显式的语句块对于控制变量的作用范围很有用。有时候,显式的语句块被用来在另一个语句块中 插入 return或是 break(参见§244)。 243-赋值 Lua允许多重赋值。因此,赋值的语法定义是等号左边放一系列变量,而等号右边放一系列的表 达式。两边的元素都用逗号间开: s七at::=Var1ist1 explistl varlistl ::=vart, var) explistl ::=expt, expy 表达式放在§25里讨论 在作赋值操作之前,那一系列的右值会被对齐到左边变量需要的个数。如果右值比需要的更多的 话,多余的值就被扔掉。如果右值的数量不够需求,将会按所需扩展若干个ni如果表达式列 表以一个函数调用结束,这个函数所返回的所有值都会在对齐操作之前被置入右值序列中。(除 非这个函数调用被用括号括了起来;参见§25) 赋值段首先会做运算完所有的表达式,然后仅仅做娬值操作。因此,下面这段代码 ir a[i] =i+l, 20 会把a[3]设置为20,而不会影响到a[4]。这是因为a[i]中的i在被赋值为4之前就被拿出来 了(那时是3)。简单说,这样一行 可以用来交换x和y中的值。 对全局变量以及 table中的域的赋值操作的含义可以通过 metatable来改变。对变量下标指向的娬 值,即t[i]=va1等价于 settable event(t,i,va1)。(关函数 settable event的详细说明 参见§2.8。这个函数并没有在Lua中定义出米,也不可以被调用。这里我们列出米,仅仅出于方 便解释的目的) 对于全局变量的赋值x=va1等价于env,x=va1,这个又可以等价于 settable event( env,",val) 这里,env指的是正在运行中的函数的环境。(变量_env并没有在Lua中定义出来。我们仅仅 出于解释的目的在这里写出来。) 244·控制结构 if、 while、以及 repeat这些控制结构符合通常的意义,而且也有类似的语法: stat :: while exp do block end stat ::=repeat block until exp stat ::=if exp then block felseif exp then block [else block] end ua也有一个for语句,它有两种形式(参见§245)。 控制结构中的条件表达式可以返回任何值。 false和nil两者都被认为是假条件。所有不同于nil 和 false的其它值都被认为是真(特别需要注意的是,数字0和空字符串也被认为是真)。 在 repeat-unt循环中,内部语句块的结束点不是在unti这个关键字处,它还包括了其后的条 件表达式。因此,条件表达式中可以使用循环内部语句块中的定义的局部变量 return被用于从函数或是 chunk(其实它就是一个函数)中返回值。函数和 chunk可以返回不只 一个值,所以 return的语法为 stat :: return [explistl break被用来结東 while、 repeat、或for循环,它将忽略掉循环中下面的语句段的运行: stat :: break break跳出最内层的循环 return和 break只能被写在一个语句块的最后一句。如果你真的需要从语句块的中间 return或是 break,你可以使用显式的声名一个内部语句块。一般写作 do return end或是 do break end 可以这样写是因为现在 return或 break都成了一个语句块的最后一句了 24.5-For语句 for有两种形式:一种是数字形式,另一种是一般形式。 数字形式的for循环,通过一个数学运算不断的运行内部的代码块。下面是它的语法: stat :: for Name exp, exp[, exp] do block end bock将把name作循环变量。从第一个ex开始起,直到第二个ep的值为止,其步长为第三个 exP。更确切的说,一个for循环看起米是这个样子 for v =el e2 e3 do block end 这等价于代码: do local var, limit, step tonumber(el), tonumber(e2),tonumber (e3) if not (var and limit and step)then error()end while (step >0 and var < limit)or (step <=0 and var >=limit)do local v= var block var var step end end 注意下面这几点: ·所有三个控制表达式都只被运算一次,表达式的计算在循环开始之前。这些表达式的结果 必须是数字。 var、 Limit、以及step都是一些不可见的变量。这里给它们起的名字都仅仅用于解释方 便 如果第三个表达式(步长)没有给出,会把步长设为1。 你可以用 break来退出for循环。 ·循环变量ⅴ是一个循环内部的局部变量;当for循环结束后,你就不能在使用它。如果你 需要这个值,在退出循环前把它娬给另一个变量。 一般形式的for通过一个叫作迭代器( iterators)的函数工作。每次迭代,迭代器函数都会被调用 以产生一个新的值,当这个值为ni时,循环停止。一般形式的for循环的语法如下 stat : for namelist in explistl do block end namelist ::=Name i Name] for语句好似这样 for var 1 var n in explist do block end 它等价于这样一段代码: do local f, s, var explist while true do 1 ocal var1,···,varn=f(s,var) var var 1 if var = nil then break end block end end 注意以下几点 · explist只会被计算一次。它返回三个值,一个迭代器函数,一个状态,一个迭代器的初 始值。 ·f、s、以及var都是不可见的变量。这里给它们起的名字都只是为了解说方便。 你可以使用 break来跳出for循环。 ·循环变量vaκ_i对于循环来说是一个局部变量;你不可以在for循环结束后继续使用。如 果你需要保留这些值,那么就在循环结束前赋值到别的变量里去。 246-把断数调用作为语句段 为了允许使用可能的副作用,函数调用可以被作为一个语句段执行: stat :i= functioncall 在这种情况下,所有的返回值都被舍弃。函数调用在§258中解释 24.7-局部变量声名 局部变量可以在语句块中任何地方声名。声名可以包含一个初始化赋值操作: stat :: local namelist [ explistll 如果有的话,初始化赋值操作的行为等同于赋值操作(参见§24.3)。否则,所有的变量将被初 始化为nil 一个 chunk同时也是一个语句块(参见§24.1),所以局部变量可以放在 chunk中那些显式注明 的语句块之外。这些局部变量的作用范围从声明起一直延伸到 chunk未尾 局部变量的可见规则在§26中解释。 25-表达式 ua中有这些基本表达式 exp ::= prefixexp exp :: nil falsetrue exp ::= Number exp string exp :: function exp ::= tableconstructor exp B:- exp :: = exp binp exp exp B8=unop exp prefixexp var functioncall( exp") 数宁和字符串在82中解释;变量在§23中解释;函数定义在§2.59中解释;函数调用在 §2.58中解释; table的构造在§2.57中解释;可变参数的表达式写作三个点(..),它只能被用 在有可变参数的函数中;这些在§259中解释。 二元操作符包含有数学运算操作符(参见§25,1),比较操作符(参见§2.52),逻辑操作符 (参见§253),以及连接操作符(参见§254)。一元操作符包括负号(参见see§25,1),取 反not(参见§253),和取长度操作符(参见§25.5)。 函数调用和可变参数表达式都可以放在多重返回值中。如果表达式作为一个独立语句段出现(参 见§2.46)(这只能是一个函数调用),它们的返回列表将被对齐到岺个元素,也就是忽略所有 返回值。如果表达式用于表达式列表的最后(或者是唯一)的元素,就不会有任何的对齐操作 (除非函数调用用括号括起来)。在任何其它的情况下,Lua将把表达式结果看成单一元素,忽 略除第一个之外的任何值。 这里有一些例子 f() 调整到0个结果 g(f();x) f()被调整到一个结果 (x,f()) g被传人x加上所有f()的返回值 a,b,c=f()r f()被调整到一个结果(c在这里被赋为ni1) a被赋值为可变参数中的第一个, b被赋值为第二个(如果可变参数中并没有对应的值, 这里a和b都有可能被赋为ni1) x f f()被调整为两个结果 a,b,c=f() -f()被调整为三个结果 return f() 返回f()返回的所有结果 return。, 返回所有从可变参数中接收来的值 return xy f() 返回x,y,以及所有f()的返回值 {f()} 用f()的所有返回值创建一个列表 用可变参数中的所有值创建一个列表 IfO, oily -f()被调整为一个结果 被括号括起来的表达式永远被当作一个值。所以,(f(x,y,z))即使f返回多个值,这个表达式永 远是一个单一值。((f(x,y,2))的值是f返回的第一个值。如果£不返回值的话,那么它的值就 是nil。) 25.1-数学运算操作符 Lua支持常见的数学运算操作符:二元操作+(加法),-(减法),*(乘法),/(除 法),号(取模),以及~(幂);和一元操作-(取负)。如果对数字操作,或是可以转换为 数字的字符串(参见§221),所有这些操作都依赖它通常的含义。幂操作可以对任何幂值都正 常工作。比如,x^(-0.5)将计算出ⅹ平方根的倒数。取模操作被定义为 a g b == a-math floor(a/b)*b 这就是说,其结果是商相对负无穷圆整后的余数。(译注:负数对正数取模的结果为正数) 252-比较操作符 Lua中的比较操作符有 < 这些操作的结果不是 false就是true 等于操作(==)首先比较操作数的类型。如果类型不同,结果就是 false。否则,继续比较值。数 字和宁符串都用常规的方式比较。对象( table, userdata, thread,以及函数)以引用的形式比 较:两个对象只有在它们指向同一个东西时才认为相等。每次你创建一个新对象(一个 table或 是 userdata, thread断数),它们都各不相同,即不同于上次创建的东西。 你可以改变La比较 table和 userdata的方式,这需要使用"eq"这个原方法(参见§28)。 §221中提及的转换规则并不作用于比较操作。所以,"0"==0等于fale,而且t[0]和t["0"] 描述的是 table中不同的域。 操作符-=完全等价于(==)操作的反值。 大小比较操作以以下方式进行。如果参数都是数字,那么就直接做数字比较。否则,如果参数都 是字符串,就用字符串比较的方式进行。再则,Lua就试着调用"t"或是"le"元方法(参见 §28)。 253-逻辑操作符 Lua中的逻辑操作符有and,or,以及not。和控制结构(参见§244)一样,所有的逻辑操作符把 false和ni都作为假,而其它的一切都当作真。 取反操作nt总是返回 false或tre中的一个。与操作符and在第一个参数为 false或mi时返回 这第一个参数;否则,and返回第二个参数。或操作符or在第一个参数不为ni也不为 false 时,返回这第一个参数,否则返回第二个参数。and和or都遵循短路规则;也就是说,第二个 操作数只在需要的时候去求值。这里有一些例子: 10or20 10 10 or error( 10 nil ora nil and 10 n工 false and error() false false and nil false false or nil nil 10 and 20 20 (在这本手册中,->指前面表达式的结果。)

...展开详情
试读 83P Lua 5.1 参考手册
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • GitHub

    绑定GitHub第三方账户获取
  • 签到王者

    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 分享宗师

    成功上传21个资源即可获取
关注 私信
上传资源赚积分or赚钱
最新推荐
Lua 5.1 参考手册 10积分/C币 立即下载
1/83
Lua 5.1 参考手册第1页
Lua 5.1 参考手册第2页
Lua 5.1 参考手册第3页
Lua 5.1 参考手册第4页
Lua 5.1 参考手册第5页
Lua 5.1 参考手册第6页
Lua 5.1 参考手册第7页
Lua 5.1 参考手册第8页
Lua 5.1 参考手册第9页
Lua 5.1 参考手册第10页
Lua 5.1 参考手册第11页
Lua 5.1 参考手册第12页
Lua 5.1 参考手册第13页
Lua 5.1 参考手册第14页
Lua 5.1 参考手册第15页
Lua 5.1 参考手册第16页
Lua 5.1 参考手册第17页

试读结束, 可继续读3页

10积分/C币 立即下载 >