﻿<?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++博客-RTY 实践出真知-随笔分类-Lua专题</title><link>http://www.cppblog.com/lauer3912/category/17477.html</link><description>没有理由不学习</description><language>zh-cn</language><lastBuildDate>Thu, 29 Nov 2012 14:02:31 GMT</lastBuildDate><pubDate>Thu, 29 Nov 2012 14:02:31 GMT</pubDate><ttl>60</ttl><item><title>Lua 语言简单入门</title><link>http://www.cppblog.com/lauer3912/archive/2012/11/29/195799.html</link><dc:creator>RTY</dc:creator><author>RTY</author><pubDate>Thu, 29 Nov 2012 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/lauer3912/archive/2012/11/29/195799.html</guid><wfw:comment>http://www.cppblog.com/lauer3912/comments/195799.html</wfw:comment><comments>http://www.cppblog.com/lauer3912/archive/2012/11/29/195799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lauer3912/comments/commentRss/195799.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lauer3912/services/trackbacks/195799.html</trackback:ping><description><![CDATA[<p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　在这篇文章中，我想向大家介绍如何进行Lua程序设计。我假设大家都学过至少一门编程语言，比如Basic或C，特别是C。因为Lua的最大用途是在宿主程序中作为脚本使用的。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　Lua 的语法比较简单，学习起来也比较省力，但功能却并不弱。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　在Lua中，一切都是变量，除了关键字。请记住这句话。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>I. 首先是注释</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　写一个程序，总是少不了注释的。<br />　　在Lua中，你可以使用单行注释和多行注释。<br />　　单行注释中，连续两个减号"--"表示注释的开始，一直延续到行末为止。相当于C++语言中的"//"。<br />　　多行注释中，由"--[["表示注释开始，并且一直延续到"]]"为止。这种注释相当于C语言中的"/*&#8230;*/"。在注释当中，"[["和"]]"是可以嵌套的。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>II. Lua编程</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　经典的"Hello world"的程序总是被用来开始介绍一种语言。在Lua中，写一个这样的程序很简单：<br />　　print("Hello world")<br />　　在Lua中，语句之间可以用分号"；"隔开，也可以用空白隔开。一般来说，如果多个语句写在同一行的话，建议总是用分号隔开。<br />　　Lua 有好几种程序控制语句，如：</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　条件控制：if 条件 then &#8230; elseif 条件 then &#8230; else &#8230; end<br />　　While循环：while 条件 do &#8230; end<br />　　Repeat循环：repeat &#8230; until 条件<br />　　For循环：for 变量 = 初值，终点值，步进 do &#8230; end<br />　　For循环：for 变量1，变量2，&#8230; ，变量N in表或枚举函数 do &#8230; end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　注意一下，for的循环变量总是只作用于for的局部变量，你也可以省略步进值，这时候，for循环会使用1作为步进值。<br />　　你可以用break来中止一个循环。<br />　　如果你有程序设计的基础，比如你学过Basic，C之类的，你会觉得Lua也不难。但Lua有几个地方是明显不同于这些程序设计语言的，所以请特别注意。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．语句块<br />　　　　语句块在C++中是用"{"和"}"括起来的，在Lua中，它是用do 和 end 括起来的。比如：&nbsp;<br />　　　　do print("Hello") end<br />　　　　你可以在 函数 中和 语句块 中定局部变量。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．赋值语句<br />　　　　赋值语句在Lua被强化了。它可以同时给多个变量赋值。<br />　　　　例如：<br />　　　　a,b,c,d=1,2,3,4<br />　　　　甚至是：<br />　　　　a,b=b,a -- 多么方便的交换变量功能啊。<br />　　　　在默认情况下，变量总是认为是全局的。假如你要定义局部变量，则在第一次赋值的时候，需要用local说明。比如：<br />　　　　local a,b,c = 1,2,3 -- a,b,c都是局部变量</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．数值运算<br />　　　　和C语言一样，支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。比如2^3 结果为8, 2^4结果为16。<br />　　　　连接两个字符串，可以用".."运处符。如：<br />　　　　"This a " .. "string." -- 等于 "this a string"</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．比较运算<br />　　　　&lt; &gt; &lt;= &gt;= == ~=<br />　　　　分别表示 小于，大于，不大于，不小于，相等，不相等<br />　　　　所有这些操作符总是返回true或false。<br />　　　　对于Table，Function和Userdata类型的数据，只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如：<br />　　　　a={1,2}<br />　　　　b=a<br />　　　　print(a==b, a~=b) -- true, false<br />　　　　a={1,2}<br />　　　　b={1,2}<br />　　　　print(a==b, a~=b) -- false, true</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．逻辑运算<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-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　举几个例子：<br />　　　　 print(4 and 5) --&gt; 5<br />　　　　 print(nil and 13) --&gt; nil<br />　　　　 print(false and 13) --&gt; false<br />　　　　 print(4 or 5) --&gt; 4<br />　　　　 print(false or 5) --&gt; 5</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　在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-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　．运算符优先级，从高到低顺序如下：<br />　　　　^<br />　　　　not - （一元运算）<br />　　　　 * /<br />　　　　 + -<br />　　　　 ..（字符串连接）<br />　　　　 &lt; &gt; &lt;= &gt;= ~= ==<br />　　　　 and<br />　　　　 or</p><div>==========================================================<br /><table width="96%" align="center" style="font-family: STHeiti;"><tbody><tr><td height="254" style="font-size: 14px; line-height: 25px;"><p>&nbsp;</p><p><strong>III. 关键字</strong></p><p>　　关键字是不能做为变量的。Lua的关键字不多，就以下几个：<br />　　and break do else elseif<br />　　end false for function if<br />　　in local nil not or<br />　　repeat return then true until　while</p><p><strong>IV. 变量类型</strong></p><p>　　怎么确定一个变量是什么类型的呢？大家可以用type()函数来检查。Lua支持的类型有以下几种：</p><p>　　Nil 空值，所有没有使用过的变量，都是nil。nil既是值，又是类型。<br />　　Boolean 布尔值<br />　　Number 数值，在Lua里，数值相当于C语言的double<br />　　String 字符串，如果你愿意的话，字符串是可以包含'\0'字符的<br />　　Table 关系表类型，这个类型功能比较强大，我们在后面慢慢说。<br />　　Function 函数类型，不要怀疑，函数也是一种类型，也就是说，所有的函数，它本身就是一个变量。<br />　　Userdata 嗯，这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的，在这种情况下，Userdata可以是宿主的任意数据类型，常用的有Struct和指针。<br />　　Thread　　 线程类型，在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。如果感兴趣的话，可以去看看Lua的文档。</p><p><strong>V. 变量的定义</strong></p><p>　　所有的语言，都要用到变量。在Lua中，不管你在什么地方使用变量，都不需要声明，并且所有的这些变量总是全局变量，除非，你在前面加上"local"。<br />　　这一点要特别注意，因为你可能想在函数里使用局部变量，却忘了用local来说明。<br />　　至于变量名字，它是大小写相关的。也就是说，A和a是两个不同的变量。<br />　　定义一个变量的方法就是赋值。"＝"操作就是用来赋值的<br />　　我们一起来定义几种常用类型的变量吧。<br />　　A. Nil<br />　　　　正如前面所说的，没有使用过的变量的值，都是Nil。有时候我们也需要将一个变量清除，这时候，我们可以直接给变量赋以nil值。如：<br />　　　　var1=nil -- 请注意 nil 一定要小写</p><p>　　B. Boolean<br />　　　　布尔值通常是用在进行条件判断的时候。布尔值有两种：true 和 false。在Lua中，只有false和nil才被计算为false，而所有任何其它类型的值，都是true。比如0，空串等等，都是true。不要被C语言的习惯所误导，0在Lua中的的确确是true。你也可以直接给一个变量赋以Boolean类型的值，如：<br />　　　　varboolean = true</p><p>　　C. Number<br />　　　　在Lua中，是没有整数类型的，也不需要。一般情况下，只要数值不是很大（比如不超过100,000,000,000,000），是不会产生舍入误差的。在很多CPU上，实数的运算并不比整数慢。<br />　　　　实数的表示方法，同C语言类似，如：<br />　　　　4 0.4 4.57e-3 0.3e12 5e+20</p><p>　　D. String<br />　　　　字符串，总是一种非常常用的高级类型。在Lua中，你可以非常方便的定义很长很长的字符串。<br />　　　　字符串在Lua中有几种方法来表示，最通用的方法，是用双引号或单引号来括起一个字符串的，如：<br />　　　　"This is a string."<br />　　　　和C语言相同的，它支持一些转义字符，列表如下：<br />　　　　\a bell<br />　　　　\b back space<br />　　　　\f form feed<br />　　　　\n newline<br />　　　　\r carriage return<br />　　　　\t horizontal tab<br />　　　　\v vertical tab<br />　　　　\\ backslash<br />　　　　\" double quote<br />　　　　\' single quote<br />　　　　\[ left square bracket<br />　　　　\] right square bracket</p><p>　　　　由于这种字符串只能写在一行中，因此，不可避免的要用到转义字符。加入了转义字符的串，看起来实在是不敢恭维，比如：<br />　　　　"one line\nnext line\n\"in quotes\", 'in quotes'"<br />　　　　一大堆的"\"符号让人看起来很倒胃口。如果你与我有同感，那么，我们在Lua中，可以用另一种表示方法：用"[["和"]]"将多行的字符串括起来，如：<br />　　　　page = [[<br />　　　　&lt;HTML&gt;<br />　　　　　　&lt;HEAD&gt;<br />　　　　　　　　&lt;TITLE&gt;An HTML Page&lt;/TITLE&gt;<br />　　　　　　&lt;/HEAD&gt;<br />　　　　　　&lt;BODY&gt;<br />　　　　　　　　&lt;A HREF="<a href="http://www.lua.org%22%3Elua%3C/A" style="color: #006699;">http://www.lua.org"&gt;Lua&lt;/A</a>&gt;<br />　　　　　　　　[[a text between double brackets]]<br />　　　　　　&lt;/BODY&gt;<br />　　　　&lt;/HTML&gt;<br />　　　　]]</p><p>　　　　值得注意的是，在这种字符串中，如果含有单独使用的"[["或"]]"就仍然得用"\["或"\]"来避免歧义。当然，这种情况是极少会发生的。</p><div></div></td></tr></tbody></table><br /><br />==================================================================<br /><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">E. Table<br />　　　　关系表类型，这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是C语言的数组，只能用正整数来作索引；在Lua中，你可以用任意类型来作数组的索引，除了nil。同样，在C语言中，数组的内容只允许一种类型；在Lua中，你也可以用任意类型的值来作数组的内容，除了nil。<br />　　　　Table的定义很简单，它的主要特征是用"{"和"}"来括起一系列数据元素的。比如：</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　T1 = {} -- 定义一个空表<br />　　　　T1[1]=10 -- 然后我们就可以象C语言一样来使用它了。<br />　　　　T1["John"]={Age=27, Gender="Male"}<br />　　　　这一句相当于：<br />　　　　T1["John"]={} -- 必须先定义成一个表，还记得未定义的变量是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-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　在定义表的时候，我们可以把所有的数据内容一起写在"{"和"}"之间，这样子是非常方便，而且很好看。比如，前面的T1的定义，我们可以这么写：</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　T1=<br />　　　　{<br />　　　　　　10, -- 相当于 [1] = 10<br />　　　　　　[100] = 40,<br />　　　　　　John= -- 如果你原意，你还可以写成：["John"] =<br />　　　　　　{<br />　　　　　　　　Age=27, -- 如果你原意，你还可以写成：["Age"] =27<br />　　　　　　　　Gender=Male -- 如果你原意，你还可以写成：["Gender"] =Male<br />　　　　　　},<br />　　　　　　20 -- 相当于 [2] = 20<br />　　　　}</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　看起来很漂亮，不是吗？我们在写的时候，需要注意三点：<br />　　　　第一，所有元素之间，总是用逗号"，"隔开；<br />　　　　第二，所有索引值都需要用"["和"]"括起来；如果是字符串，还可以去掉引号和中括号；<br />　　　　第三，如果不写索引，则索引就会被认为是数字，并按顺序自动从1往后编；</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　表类型的构造是如此的方便，以致于常常被人用来代替配置文件。是的，不用怀疑，它比ini文件要漂亮，并且强大的多。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　F. Function<br />　　　　函数，在Lua中，函数的定义也很简单。典型的定义如下：<br />　　　　function add(a,b) -- add 是函数名字，a和b是参数名字<br />　　　　 return a+b -- return 用来返回函数的运行结果<br />　　　　end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　请注意，return语言一定要写在end之前。假如你非要在中间放上一句return，那么请写成：do return end。<br />　　　　还记得前面说过，函数也是变量类型吗？上面的函数定义，其实相当于：<br />　　　　add = function (a,b) return a+b end<br />　　　　当你重新给add赋值时，它就不再表示这个函数了。你甚至可以赋给add任意数据，包括nil （这样，你就清除了add变量）。Function是不是很象C语言的函数指针呢？</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　和C语言一样，Lua的函数可以接受可变参数个数，它同样是用"&#8230;"来定义的，比如：<br />　　　　function sum (a,b,&#8230;)<br />　　　　如果想取得&#8230;所代表的参数，可以在函数中访问arg局部变量（表类型）得到。<br />　　　　如 sum(1,2,3,4)<br />　　　　则，在函数中，a = 1, b = 2, arg = {3, 4}<br />　　　　更可贵的是，它可以同时返回多个结果，比如：<br />　　　　function s()<br />　　　　　　return 1,2,3,4<br />　　　　end<br />　　　　a,b,c,d = s() -- 此时，a = 1, b = 2, c = 3, d = 4<br />前面说过，表类型可以拥有任意类型的值，包括函数！因此，有一个很强大的特性是，拥有函数的表，哦，我想更恰当的应该说是对象吧。Lua可以使用面向对象编程了。不信？那我举例如下：</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　t =<br />　　　　{<br />　　　　 Age = 27<br />　　　　 add = function(self, n) self.Age = self.Age+n end<br />　　　　}<br />　　　　print(t.Age) -- 27<br />　　　　t.add(t, 10)<br />　　　　print(t.Age) -- 37</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　　　不过，t.add(t,10) 这一句实在是有点土对吧？没关系，在Lua中，你可以简写成：<br />　　　　t:add(10) -- 相当于 t.add(t,10)</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　G. Userdata 和 Thread<br />　　　　这两个类型的话题，超出了本文的内容，就不打算细说了。</p>===========================================================<br /><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>VI. 结束语</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">　　就这么结束了吗？当然不是，接下来，需要用Lua解释器，来帮助你理解和实践了。这篇小文只是帮助你大体了解Lua的语法。如果你有编程基础，相信会很快对Lua上手了。<br />　　就象C语言一样，Lua提供了相当多的标准函数来增强语言的功能。使用这些标准函数，你可以很方便的操作各种数据类型，并处理输入输出。有关这方面的信息，你可以参考《Programming in Lua 》一书，你可以在网络上直接观看电子版，网址为：<a href="http://www.lua.org/pil/index.html" style="color: #006699;">http://www.lua.org/pil/index.html</a><br />　　当然，Lua的最强大的功能是能与宿主程序亲蜜无间的合作，因此，下一篇文章，我会告诉大家，如何在你的程序中使用Lua语言作为脚本，使你的程序和Lua脚本进行交互。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>使用流程</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>1. 函数的使用</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 以下程序演示了如何在Lua中使用函数, 及局部变量<br />例e02.lua<br />-- functions&nbsp;<br />function pythagorean(a, b)&nbsp;<br />local c2 = a^2 + b^2&nbsp;<br />return sqrt(c2)&nbsp;<br />end&nbsp;<br />print(pythagorean(3,4))</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">运行结果<br />5</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">程序说明<br />在Lua中函数的定义格式为:<br />function 函数名(参数)<br />...<br />end<br />&nbsp;&nbsp;&nbsp; 与Pascal语言不同, end不需要与begin配对, 只需要在函数结束后打个end就可以了.本例函数的作用是已知直角三角形直角边, 求斜边长度. 参数a,b分别表示直角边长,<br />&nbsp;&nbsp;&nbsp; 在函数内定义了local形变量用于存储斜边的平方. 与C语言相同, 定义在函数内的代码不会被直接执行, 只有主程序调用时才会被执行.<br />&nbsp;&nbsp;&nbsp; local表示定义一个局部变量, 如果不加local刚表示c2为一个全局变量, local的作用域是在最里层的end和其配对的关键字之间, 如if ... end, while ... end等。全局变量的作用域是整个程序。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>2. 循环语句</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">例e03.lua<br />-- Loops&nbsp;<br />for i=1,5 do&nbsp;<br />print("i is now " .. i)&nbsp;<br />end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">运行结果<br />i is now 1&nbsp;<br />i is now 2&nbsp;<br />i is now 3&nbsp;<br />i is now 4&nbsp;<br />i is now 5</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">程序说明<br />&nbsp;&nbsp;&nbsp; 这里偶们用到了for语句<br />for 变量 = 参数1, 参数2, 参数3 do<br />循环体<br />end<br />&nbsp;&nbsp;&nbsp; 变量将以参数3为步长, 由参数1变化到参数2<br />例如:&nbsp;<br />for i=1,f(x) do print(i) end<br />for i=10,1,-1 do print(i) end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 这里print("i is now " .. i)中，偶们用到了..，这是用来连接两个字符串的，偶在(1)的试试看中提到的，不知道你们答对了没有。虽然这里i是一个整型量，Lua在处理的时候会自动转成字符串型，不需偶们费心。</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><strong>3. 条件分支语句</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">例e04.lua<br />-- Loops and conditionals&nbsp;<br />for i=1,5 do<br />print(&#8220;i is now &#8220; .. i)<br />if i &lt; 2 then&nbsp;<br />print(&#8220;small&#8221;)&nbsp;<br />elseif i &lt; 4 then&nbsp;<br />print(&#8220;medium&#8221;)&nbsp;<br />else&nbsp;<br />print(&#8220;big&#8221;)&nbsp;<br />end&nbsp;<br />end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">运行结果<br />i is now 1&nbsp;<br />small&nbsp;<br />i is now 2&nbsp;<br />medium&nbsp;<br />i is now 3&nbsp;<br />medium&nbsp;<br />i is now 4&nbsp;<br />big&nbsp;<br />i is now 5&nbsp;<br />big</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">程序说明<br />&nbsp;&nbsp;&nbsp; if else用法比较简单, 类似于C语言, 不过此处需要注意的是整个if只需要一个end,哪怕用了多个elseif, 也是一个end.<br />例如<br />if op == "+" then<br />r = a + b<br />elseif op == "-" then<br />r = a - b<br />elseif op == "*" then<br />r = a*b<br />elseif op == "/" then<br />r = a/b<br />else<br />error("invalid operation")<br />end</p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;"><br /><strong>4.试试看</strong></p><p style="font-family: STHeiti; line-height: 25px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; Lua中除了for循环以外, 还支持多种循环, 请用while...do和repeat...until改写本文中的for程序。<br /><p><strong>数组的使用</strong></p><p><strong>1.简介</strong></p><p>&nbsp;&nbsp;&nbsp; Lua语言只有一种基本数据结构, 那就是table, 所有其他数据结构如数组啦,类啦, 都可以由table实现.</p><p><strong>2.table的下标</strong></p><p>例e05.lua<br />-- Arrays&nbsp;<br />myData = {}&nbsp;<br />myData[0] = &#8220;foo&#8221;&nbsp;<br />myData[1] = 42</p><p>-- Hash tables&nbsp;<br />myData[&#8220;bar&#8221;] = &#8220;baz&#8221;</p><p>-- Iterate through the&nbsp;<br />-- structure&nbsp;<br />for key, value in myData do&nbsp;<br />print(key .. &#8220;=&#8220; .. value)&nbsp;<br />end</p><p>输出结果<br />0=foo&nbsp;<br />1=42&nbsp;<br />bar=baz</p><p>程序说明<br />&nbsp;&nbsp;&nbsp; 首先定义了一个table myData={}, 然后用数字作为下标赋了两个值给它. 这种定义方法类似于C中的数组, 但与数组不同的是, 每个数组元素不需要为相同类型,就像本例中一个为整型, 一个为字符串.</p><p>&nbsp;&nbsp;&nbsp; 程序第二部分, 以字符串做为下标, 又向table内增加了一个元素. 这种table非常像STL里面的map. table下标可以为Lua所支持的任意基本类型, 除了nil值以外.</p><p>&nbsp;&nbsp;&nbsp; Lua对Table占用内存的处理是自动的, 如下面这段代码<br />a = {}<br />a["x"] = 10<br />b = a -- `b' refers to the same table as `a'<br />print(b["x"]) --&gt; 10<br />b["x"] = 20<br />print(a["x"]) --&gt; 20<br />a = nil -- now only `b' still refers to the table<br />b = nil -- now there are no references left to the table<br />&nbsp;&nbsp;&nbsp; b和a都指向相同的table, 只占用一块内存, 当执行到a = nil时, b仍然指向table,<br />&nbsp;&nbsp;&nbsp; 而当执行到b=nil时, 因为没有指向table的变量了, 所以Lua会自动释放table所占内存</p><p><strong>3.Table的嵌套</strong></p><p>&nbsp;&nbsp;&nbsp; Table的使用还可以嵌套，如下例<br />例e06.lua<br />-- Table &#8216;constructor&#8217;&nbsp;<br />myPolygon = {&nbsp;<br />color=&#8220;blue&#8221;,&nbsp;<br />thickness=2,&nbsp;<br />npoints=4;&nbsp;<br />{x=0, y=0},&nbsp;<br />{x=-10, y=0},&nbsp;<br />{x=-5, y=4},&nbsp;<br />{x=0, y=4}&nbsp;<br />}</p><p>-- Print the color&nbsp;<br />print(myPolygon[&#8220;color&#8221;])</p><p>-- Print it again using dot&nbsp;<br />-- notation&nbsp;<br />print(myPolygon.color)</p><p>-- The points are accessible&nbsp;<br />-- in myPolygon[1] to myPolygon[4]</p><p>-- Print the second point&#8217;s x&nbsp;<br />-- coordinate&nbsp;<br />print(myPolygon[2].x)</p><p><strong>程序说明</strong></p><p>&nbsp; &nbsp; 首先建立一个table, 与上一例不同的是，在table的constructor里面有{x=0,y=0}, 这是什么意思呢？ 这其实就是一个小table, 定义在了大table之内, 小table的table名省略了.最后一行myPolygon[2].x，就是大table里面小table的访问方式.</p><div></div></p></div><img src ="http://www.cppblog.com/lauer3912/aggbug/195799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lauer3912/" target="_blank">RTY</a> 2012-11-29 16:32 <a href="http://www.cppblog.com/lauer3912/archive/2012/11/29/195799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lupa - Python中调用Lua</title><link>http://www.cppblog.com/lauer3912/archive/2011/09/15/155808.html</link><dc:creator>RTY</dc:creator><author>RTY</author><pubDate>Wed, 14 Sep 2011 22:52:00 GMT</pubDate><guid>http://www.cppblog.com/lauer3912/archive/2011/09/15/155808.html</guid><wfw:comment>http://www.cppblog.com/lauer3912/comments/155808.html</wfw:comment><comments>http://www.cppblog.com/lauer3912/archive/2011/09/15/155808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lauer3912/comments/commentRss/155808.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lauer3912/services/trackbacks/155808.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.cnblogs.com/coderzh/archive/2010/11/29/lupa.htmlLupa - Python中调用LuaLupa将LuaJIT集成到了Python模块中，可以在Python中执行Lua代码。 比较有意思，也许以后用的着，记录一下。基本用法：&gt;&gt;&gt;&nbsp;import&nbsp;lupa&gt;&gt;&gt;&nbsp;fr...&nbsp;&nbsp;<a href='http://www.cppblog.com/lauer3912/archive/2011/09/15/155808.html'>阅读全文</a><img src ="http://www.cppblog.com/lauer3912/aggbug/155808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lauer3912/" target="_blank">RTY</a> 2011-09-15 06:52 <a href="http://www.cppblog.com/lauer3912/archive/2011/09/15/155808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍LuaPlus: 好用的Lua For C++扩展(修订)</title><link>http://www.cppblog.com/lauer3912/archive/2011/08/03/152320.html</link><dc:creator>RTY</dc:creator><author>RTY</author><pubDate>Tue, 02 Aug 2011 23:42:00 GMT</pubDate><guid>http://www.cppblog.com/lauer3912/archive/2011/08/03/152320.html</guid><wfw:comment>http://www.cppblog.com/lauer3912/comments/152320.html</wfw:comment><comments>http://www.cppblog.com/lauer3912/archive/2011/08/03/152320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lauer3912/comments/commentRss/152320.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lauer3912/services/trackbacks/152320.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 介绍LuaPlus: 好用的Lua For C++扩展(修订)LuaPlus是Lua的C++增强，也就是说，LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作，是比较好的一个选择。LuaPlus目前版本为：LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大家可以到http://luaplus....&nbsp;&nbsp;<a href='http://www.cppblog.com/lauer3912/archive/2011/08/03/152320.html'>阅读全文</a><img src ="http://www.cppblog.com/lauer3912/aggbug/152320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lauer3912/" target="_blank">RTY</a> 2011-08-03 07:42 <a href="http://www.cppblog.com/lauer3912/archive/2011/08/03/152320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>