﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-xiaolige945@qq.com-随笔分类-lua</title><link>http://www.cppblog.com/xiaolige945/category/7001.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:55:59 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:55:59 GMT</pubDate><ttl>60</ttl><item><title>(转载)Lua脚本语法说明</title><link>http://www.cppblog.com/xiaolige945/archive/2008/05/08/49263.html</link><dc:creator>xiaolige945</dc:creator><author>xiaolige945</author><pubDate>Thu, 08 May 2008 14:38:00 GMT</pubDate><guid>http://www.cppblog.com/xiaolige945/archive/2008/05/08/49263.html</guid><wfw:comment>http://www.cppblog.com/xiaolige945/comments/49263.html</wfw:comment><comments>http://www.cppblog.com/xiaolige945/archive/2008/05/08/49263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaolige945/comments/commentRss/49263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaolige945/services/trackbacks/49263.html</trackback:ping><description><![CDATA[<p dir=ltr style="FONT-SIZE: 10pt; COLOR: #030605; MARGIN-RIGHT: 0px"></p>
<div style="BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BORDER-LEFT: #666666 1px solid; COLOR: #030605; BORDER-BOTTOM: #666666 1px solid">
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的归纳一下Lua的一些语法规则，使用起来方便好查就可以了。估计看完了，就懂得怎么写Lua程序了。<br>　　在Lua中，一切都是变量，除了关键字。</p>
<p style="FONT-SIZE: 10pt">I.&nbsp; 首先是注释<br>　　写一个程序，总是少不了注释的。<br>　　在Lua中，你可以使用单行注释和多行注释。<br>　　单行注释中，连续两个减号"--"表示注释的开始，一直延续到行末为止。相当于C++语言中的"//"。<br>　　多行注释中，由"--[["表示注释开始，并且一直延续到"]]"为止。这种注释相当于C语言中的"/*...*/"。在注释<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当中，"[["和"]]"是可以嵌套的（在lua5.1中，中括号中间是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以加若干个"="号的，如 [==[ ... ]==]），见下面的字符串表示说明。</p>
<p style="FONT-SIZE: 10pt">II.&nbsp; Lua编程<br>　　经典的"Hello world"的程序总是被用来开始介绍一种语言。在Lua中，写一个这样的程序很简单：<br>　　print("Hello world")<br>　　在Lua中，语句之间可以用分号"；"隔开，也可以用空白隔开。一般来说，如果多个语句写在同一行的话，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议总是用分号隔开。Lua 有好几种程序控制语句，如：控制语句&nbsp;格式&nbsp;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; 示例<br>&nbsp;&nbsp;&nbsp;&nbsp; If<br>&nbsp;&nbsp;&nbsp;&nbsp; if 条件 then ... elseif 条件 then ... else ... end&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; if 1+1=2 then print("true") <br>&nbsp;&nbsp;&nbsp;&nbsp; elseif 1+2~=3 then print("true") <br>&nbsp;&nbsp;&nbsp;&nbsp; else print("false") end<br>&nbsp;&nbsp;&nbsp;&nbsp; While<br>&nbsp;&nbsp;&nbsp;&nbsp; while 条件 do ... end&nbsp;while 1+1~=2 do print("true") end<br>&nbsp;&nbsp;&nbsp;&nbsp; Repeat<br>&nbsp;&nbsp;&nbsp;&nbsp; repeat ... until 条件&nbsp;repeat print("Hello") until 1+1~=2<br>&nbsp;&nbsp;&nbsp;&nbsp; For<br>&nbsp;&nbsp;&nbsp;&nbsp; for 变量=初值, 终点值, 步进 do ... end&nbsp;for i = 1, 10, 2 do print(i) end<br>&nbsp;&nbsp;&nbsp;&nbsp; For<br>&nbsp;&nbsp;&nbsp;&nbsp; for 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end&nbsp;for a,b in mylist do print(a, b) end</p>
<p style="FONT-SIZE: 10pt">　　注意一下，for的循环变量总是只作用于for的局部变量；当省略步进值时，for循环会使用1作为步进值。<br>　　使用break可以用来中止一个循环。<br>　　相对C语言来说，Lua有几个地方是明显不同的，所以面要特别注意一下：</p>
<p style="FONT-SIZE: 10pt">　　．语句块<br>　　　　语句块在C中是用"{"和"}"括起来的，在Lua中，它是用do 和 end 括起来的。比如：<br>　　　　do print("Hello") end<br>　　　　可以在 函数 中和 语句块 中定局部变量。</p>
<p style="FONT-SIZE: 10pt">　　．赋值语句<br>　　　　赋值语句在Lua被强化了。它可以同时给多个变量赋值。<br>　　　　例如：<br>　　　　a,b,c,d=1,2,3,4<br>　　　　甚至是：<br>　　　　a,b=b,a&nbsp; -- 多么方便的交换变量功能啊。<br>　　　　在默认情况下，变量总是认为是全局的。假如需要定义局部变量，则在第一次赋值的时候，需要<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用local说明。比如：<br>　　　　local a,b,c = 1,2,3&nbsp; -- a,b,c都是局部变量</p>
<p style="FONT-SIZE: 10pt">　　．数值运算<br>　　　　和C语言一样，支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如2^3 结果为8, 2^4结果为16。<br>　　　　连接两个字符串，可以用".."运处符。如：<br>　　　　"This a " .. "string." -- 等于 "this a string"</p>
<p style="FONT-SIZE: 10pt">　　．比较运算比较符号&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&nbsp;&gt;&nbsp;&lt;=&nbsp;&gt;=&nbsp;==&nbsp;~=<br>&nbsp;小于&nbsp;大于&nbsp;小于或等于&nbsp;大于或等于&nbsp;相等&nbsp;不相等</p>
<p style="FONT-SIZE: 10pt">　　　　所有这些操作符总是返回true或false。<br>　　　　对于Table，Function和Userdata类型的数据，只有 == 和 ~=可以用。相等表示两个变量引用的是<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同一个数据。比如：<br>　　　　a={1,2}<br>　　　　b=a<br>　　　　print(a==b, a~=b)&nbsp; --输出 true, false<br>　　　　a={1,2}<br>　　　　b={1,2}<br>　　　　print(a==b, a~=b)&nbsp; --输出 false, true</p>
<p style="FONT-SIZE: 10pt">　　．逻辑运算<br>　　　　and, or, not<br>　　　　其中，and 和 or 与C语言区别特别大。<br>　　　　在这里，请先记住，在Lua中，只有false和nil才计算为false，其它任何数据都计算为true，0也是true！<br>　　　　and 和 or的运算结果不是true和false，而是和它的两个操作数相关。<br>　　　　a and b：如果a为false，则返回a；否则返回b<br>　　　　a or b：如果 a 为true，则返回a；否则返回b</p>
<p style="FONT-SIZE: 10pt">　　　　举几个例子：<br>　　　　 print(4 and 5) --输出 5<br>　　　　 print(nil and 13) --输出 nil<br>　　　　 print(false and 13) --输出 false<br>　　　　 print(4 or 5) --输出 4<br>　　　　 print(false or 5) --输出 5</p>
<p style="FONT-SIZE: 10pt"><br>　　　　在Lua中这是很有用的特性，也是比较令人混洧的特性。<br>　　　　我们可以模拟C语言中的语句：x = a? b : c，在Lua中，可以写成：x = a and b or c。<br>　　　　最有用的语句是： x = x or v，它相当于：if not x then x = v end 。</p>
<p style="FONT-SIZE: 10pt">　　．运算符优先级，从低到高顺序如下：&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp;&nbsp; &lt;=&nbsp;&nbsp;&nbsp; &gt;=&nbsp;&nbsp;&nbsp; ~=&nbsp;&nbsp;&nbsp; ==&nbsp;&nbsp; .. (字符串连接)&nbsp;&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp;&nbsp; %<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not&nbsp;&nbsp; #(lua5.1 取长度运算)&nbsp;&nbsp;&nbsp;&nbsp; - (一元运算) ^</p>
<p style="FONT-SIZE: 10pt">　　　　和C语言一样，括号可以改变优先级。</p>
<p style="FONT-SIZE: 10pt">III.&nbsp; 关键字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字是不能做为变量的。Lua的关键字不多，就以下几个：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;break&nbsp;do&nbsp;else&nbsp;elseif&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;false&nbsp;for&nbsp;function&nbsp;if&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;local&nbsp;nil&nbsp;not&nbsp;or&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repeat&nbsp;return&nbsp;then&nbsp;true&nbsp;until&nbsp;while<br><br>IV.&nbsp; 变量类型<br>　 怎么确定一个变量是什么类型的呢？大家可以用type()函数来检查。Lua支持的类型有以下几种：Nil&nbsp;空值，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有没有使用过的变量，都是nil。nil既是值，又是类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean&nbsp;布尔值，只有两个有效值：true和false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number&nbsp;数值，在Lua里，数值相当于C语言的double<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;字符串，如果你愿意的话，字符串是可以包含"\0"字符的（这和C语言总是以"\0"结尾是不一样的）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Table&nbsp;关系表类型，这个类型功能比较强大，请参考后面的内容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Function&nbsp;函数类型，不要怀疑，函数也是一种类型，也就是说，所有的函数，它本身就是一个变量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Userdata&nbsp;嗯，这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的，在这种情况下，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Userdata可以是宿主的任意数据类型，常用的有Struct和指针。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread&nbsp;线程类型，在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。如果感兴趣的话，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以去看看Lua的文档。<br><br>V.&nbsp; 变量的定义<br>　 所有的语言，都要用到变量。在Lua中，不管在什么地方使用变量，都不需要声明，并且所有的这些变<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;量总是全局变量，除非我们在前面加上"local"。这一点要特别注意，因为我<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 们可能想在函数里使用局部变量，却忘了用local来说明。<br>　 至于变量名字，它是大小写相关的。也就是说，A和a是两个不同的变量。<br>　&nbsp; 定义一个变量的方法就是赋值。"＝"操作就是用来赋值的<br>　 我们一起来定义几种常用类型的变量吧。<br>　 A.&nbsp; Nil<br>　　　　正如前面所说的，没有使用过的变量的值，都是Nil。有时候我们也需要将一个变量清除，这时候，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以直接给变量赋以nil值。如：<br>　　　　var1=nil&nbsp; -- 请注意 nil 一定要小写</p>
<p style="FONT-SIZE: 10pt">　 B.&nbsp; Boolean<br>　　　　布尔值通常是用在进行条件判断的时候。布尔值有两种：true 和 false。在Lua中，只有false和nil才被<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算为false，而所有任何其它类型的值，都是true。比如0，空串等等，都是true。不要被 C语言的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 习惯所误导，0在Lua中的的确确是true。你也可以直接给一个变量赋以Boolean类型的值，如：<br>　　　　theBoolean = true</p>
<p style="FONT-SIZE: 10pt">　 C.&nbsp; Number<br>　　　　在Lua中，是没有整数类型的，也不需要。一般情况下，只要数值不是很大<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （比如不超过100,000,000,000,000），是不会产生舍入误差的。在WindowsXP能跑的当今主流PC<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上，实数的运算并不比整数慢。<br>　　　　实数的表示方法，同C语言类似，如：<br>　　　　4 0.4 4.57e-3 0.3e12 5e+20</p>
<p style="FONT-SIZE: 10pt">　 D.&nbsp; String<br>　　　　字符串，总是一种非常常用的高级类型。在Lua中，我们可以非常方便的定义很长很长的字符串。<br>　　　　字符串在Lua中有几种方法来表示，最通用的方法，是用双引号或单引号来括起一个字符串的，如：<br>　　　　"That's go!"<br>　　　　或<br>　　　　'Hello world!'</p>
<p style="FONT-SIZE: 10pt">　　　　和C语言相同的，它支持一些转义字符，列表如下：<br>　　　　\a&nbsp; bell<br>　　　　\b&nbsp; back space<br>　　　　\f&nbsp; form feed<br>　　　　\n&nbsp; newline<br>　　　　\r&nbsp; carriage return<br>　　　　\t&nbsp; horizontal tab<br>　　　　\v&nbsp; vertical tab<br>　　　　\\&nbsp; backslash<br>　　　　\"&nbsp; double quote<br>　　　　\"&nbsp; single quote<br>　　　　\[&nbsp; left square bracket<br>　　　　\]&nbsp; right square bracket</p>
<p style="FONT-SIZE: 10pt">　　　　由于这种字符串只能写在一行中，因此，不可避免的要用到转义字符。加入了转义字符的串，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看起来实在是不敢恭维，比如：<br>　　　　"one line\nnext line\n\"in quotes\", "in quotes""<br>　　　&nbsp; 一大堆的"\"符号让人看起来很倒胃口。如果你与我有同感，那么，我们在Lua中，可以用另一种<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示方法：用"[["和"]]"将多行的字符串括起来。（lua5.1: 中括号中间可以<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;加入若干个"="号，如 [==[ ... ]==]，详见下面示例）<br>　　　 示例：下面的语句所表示的是完全相同的字符串：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = 'alo\n123"'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = "alo\n123\""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = '\97lo\10\04923"'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = [[alo123"]]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = [==[alo123"]==]</p>
<p style="FONT-SIZE: 10pt">　　　　值得注意的是，在这种字符串中，如果含有单独使用的"[["或"]]"就仍然得用"\["或"\]"来避免歧义。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，这种情况是极少会发生的。</p>
<p style="FONT-SIZE: 10pt">　　E.&nbsp; Table<br>　　　　关系表类型，这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是C语言的数组，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只能用正整数来作索引；在Lua中，你可以用任意类型来作数组的索引，除了nil。同样，在C语言<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中，数组的内容只允许一种类型；在Lua中，你也可以用任意类型的值来作数组的内容，除了nil。<br>　　　　Table的定义很简单，它的主要特征是用"{"和"}"来括起一系列数据元素的。比如：<br>　　　　T1 = {}&nbsp; -- 定义一个空表<br>　　　　T1[1]=10&nbsp; -- 然后我们就可以象C语言一样来使用它了。</p>
<p style="FONT-SIZE: 10pt">　　　　T1["John"]={Age=27, Gender="Male"}<br>　　　　这一句相当于：<br>　　　　T1["John"]={}&nbsp; -- 必须先定义成一个表，还记得未定义的变量是nil类型吗<br>　　　　T1["John"]["Age"]=27<br>　　　　T1["John"]["Gender"]="Male"<br>　　　　当表的索引是字符串的时候，我们可以简写成：<br>　　　　T1.John={}<br>　　　　T1.John.Age=27<br>　　　　T1.John.Gender="Male"<br>　　　　或<br>　　　　T1.John{Age=27, Gender="Male"}<br>　　　　这是一个很强的特性。</p>
<p style="FONT-SIZE: 10pt">　　　　在定义表的时候，我们可以把所有的数据内容一起写在"{"和"}"之间，这样子是非常方便，而且很<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好看。比如，前面的T1的定义，我们可以这么写：<br>　　　　T1=<br>　　　　{<br>　　　　　　10,&nbsp; -- 相当于 [1] = 10<br>　　　　　　[100] = 40,<br>　　　　　　John=&nbsp; -- 如果你原意，你还可以写成：["John"] =<br>　　　　　　{<br>　　　　　　　　Age=27,&nbsp;&nbsp; -- 如果你原意，你还可以写成：["Age"] =27<br>　　　　　　　　Gender=Male&nbsp;&nbsp; -- 如果你原意，你还可以写成：["Gender"] =Male<br>　　　　　　},<br>　　　　　　20&nbsp; -- 相当于 [2] = 20<br>　　　　}</p>
<p style="FONT-SIZE: 10pt"><br>　　　　看起来很漂亮，不是吗？我们在写的时候，需要注意三点：<br>　　　　第一，所有元素之间，总是用逗号"，"隔开；<br>　　　　第二，所有索引值都需要用"["和"]"括起来；如果是字符串，还可以去掉引号和中括号；<br>　　　　第三，如果不写索引，则索引就会被认为是数字，并按顺序自动从1往后编；</p>
<p style="FONT-SIZE: 10pt">　　　　表类型的构造是如此的方便，以致于常常被人用来代替配置文件。是的，不用怀疑，它比ini文件要<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 漂亮，并且强大的多。</p>
<p style="FONT-SIZE: 10pt">　　F.&nbsp; Function<br>　　　　函数，在Lua中，函数的定义也很简单。典型的定义如下：<br>　　　　function add(a,b)&nbsp; -- add 是函数名字，a和b是参数名字<br>　　　　 return a+b&nbsp; -- return 用来返回函数的运行结果<br>　　　　end</p>
<p style="FONT-SIZE: 10pt">　　　　请注意，return语言一定要写在end之前。假如我们非要在中间放上一句return，那么就应该要写<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成：do return end。<br>　　　　还记得前面说过，函数也是变量类型吗？上面的函数定义，其实相当于：<br>　　　　add = function (a,b) return a+b end<br>　　　　当重新给add赋值时，它就不再表示这个函数了。我们甚至可以赋给add任意数据，包括nil&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（这样，赋值为nil，将会把该变量清除）。Function是不是很象C语言的函数指针呢？</p>
<p style="FONT-SIZE: 10pt">　　　　和C语言一样，Lua的函数可以接受可变参数个数，它同样是用"..."来定义的，比如：<br>　　　　function sum (a,b,)<br>　　　　如果想取得...所代表的参数，可以在函数中访问arg局部变量（表类型）得到 (lua5.1: 取消arg，并直接<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用"..."来代表可变参数了，本质还是arg)。<br>　　　　如 sum(1,2,3,4)<br>　　　　则，在函数中，a = 1, b = 2, arg = {3, 4}&nbsp; (lua5.1:&nbsp; a = 1, b = 2, ... = {3, 4})<br>　　　　更可贵的是，它可以同时返回多个结果，比如：<br>　　　　function s()<br>　　　　　　return 1,2,3,4<br>　　　　end<br>　　　　a,b,c,d = s()&nbsp; -- 此时，a = 1, b = 2, c = 3, d = 4</p>
<p style="FONT-SIZE: 10pt">　　　　前面说过，表类型可以拥有任意类型的值，包括函数！因此，有一个很强大的特性是，拥有函数的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表，哦，我想更恰当的应该说是对象吧。Lua可以使用面向对象编程了。不信？举例如下：<br>　　　　t =<br>　　　　{<br>　　　　 Age = 27<br>　　　　 add = function(self, n) self.Age = self.Age+n end<br>　　　　}<br>　　　　print(t.Age)&nbsp; -- 27<br>　　　　t.add(t, 10)<br>　　　　print(t.Age)&nbsp; -- 37</p>
<p style="FONT-SIZE: 10pt">　　　　不过，t.add(t,10) 这一句实在是有点土对吧？没关系，在Lua中，我们可以简写成：<br>　　　　t:add(10)&nbsp;&nbsp;&nbsp; -- 相当于 t.add(t,10)</p>
<p style="FONT-SIZE: 10pt">　　G.&nbsp; Userdata 和 Thread<br>　　　　这两个类型的话题，超出了本文的内容，就不打算细说了。</p>
<p style="FONT-SIZE: 10pt">相关链接：<br>1. Lua 官方网站： <a href="http://www.lua.org/">http://www.lua.org</a> <br>2. Lua Wiki网站，有很多相关的资料，如文档、教程、扩展，以及C/C++的包装等： <a href="http://lua-users.org/wiki/">http://lua-users.org/wiki/</a>&nbsp;&nbsp; </p>
</div>
<p style="COLOR: #030605">&nbsp;</p>
<img src ="http://www.cppblog.com/xiaolige945/aggbug/49263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaolige945/" target="_blank">xiaolige945</a> 2008-05-08 22:38 <a href="http://www.cppblog.com/xiaolige945/archive/2008/05/08/49263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>