﻿<?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++博客-::梁乔峰::明镜台::原创空间::C#.NET2.0,C++技术BLOG-随笔分类-Lua学习笔记</title><link>http://www.cppblog.com/AthrunOnline/category/10514.html</link><description>人最重要的是心境,一颗平静安稳的心才能更好的进步,保持自己的心态.成为梦想中的高手</description><language>zh-cn</language><lastBuildDate>Tue, 26 May 2009 10:37:39 GMT</lastBuildDate><pubDate>Tue, 26 May 2009 10:37:39 GMT</pubDate><ttl>60</ttl><item><title>lua学习之入门(三)----函数</title><link>http://www.cppblog.com/AthrunOnline/archive/2009/05/14/82943.html</link><dc:creator>梁乔峰</dc:creator><author>梁乔峰</author><pubDate>Thu, 14 May 2009 05:14:00 GMT</pubDate><guid>http://www.cppblog.com/AthrunOnline/archive/2009/05/14/82943.html</guid><wfw:comment>http://www.cppblog.com/AthrunOnline/comments/82943.html</wfw:comment><comments>http://www.cppblog.com/AthrunOnline/archive/2009/05/14/82943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AthrunOnline/comments/commentRss/82943.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AthrunOnline/services/trackbacks/82943.html</trackback:ping><description><![CDATA[<p>
		</p>
		<p>1、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl04_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/11/82583.html"><font color="#4371a6">lua学习之入门(一)----环境搭建</font></a><br /><br />2、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl02_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82640.html"><font color="#4371a6">lua学习之入门(二)----基础语法1</font></a><br /><br />3、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82687.html"><font color="#4371a6">lua学习之入门(二)----基础语法2</font></a><br /><br />4、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl02_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/14/82943.html"><font color="#4371a6">lua学习之入门(三)----函数</font></a></p>
		<p>     在LUA里函数是个十分重要的内容,因为我们实际开发的时候,用的最多的就是函数,用函数是封装各个实现,在Q群里曾经听一些大虾说过,写LUA必须要懂得闭包,常用系统函数,还有范型for写迭代器,最后就是编译和运行还有错误信息.其实这章,我就卡了一下壳,卡壳的地方在闭包,因为我没有完全理解闭包的作用,和闭包的好处,网上也没有明确的说明闭包的优劣,所以闭包的概念,我也只能以个人感觉去写,如果我说得不对,欢迎赐教.如果对闭包理解很深,欢迎来指教...你要偶拜你为师也行,达者为师啊,偶很好学的.</p>
		<p>函数有两种用途：1.完成指定的任务，这种情况下函数作为调用语句使用；2.计算并返回值，这种情况下函数作为赋值语句的表达式使用。</p>
		<p>   其实我们接触最早的,就是函数,还记得我们的第一个LUA吗?print();这就是一个函数.可以理解****()都可以当做是函数,其实大部分编程语言的函数都是以这个方式一共调用的.认识了什么是函数,那么我们就自己编写一个函数吧</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">function maxFun(a</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">b)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> a</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">b then<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> a;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   </span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> b;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">我们用一个输出语句把我们的函数结果显示出来</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">证明我们写的函数没有问题<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">print</span>
				<span style="COLOR: #000000">(maxFun(</span>
				<span style="COLOR: #800000">4</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #800000">3</span>
				<span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />上面这个函数</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">其实很简单就是比较两个数的大小</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #000000">最后运行的结果我们得到结果是4</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">这里使用的是函数的第1种任务</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">判断两个数的大小</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">在LUA里函数是可以返回多个值的</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">这个点和其他编程语言有很大的区别</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">那就很容易造成错觉</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">多个返回值</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">那我如何获得各个返回值呢</span>
				<span style="COLOR: #000000">?</span>
				<span style="COLOR: #000000">看例子<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />function returnAnyValue()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">1</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #800000">2</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #800000">3</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #800000">4</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">b</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">c</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">d </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> returnAnyValue();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />e</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">f</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">g </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> returnAnyValue();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />h</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">i</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">j</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">k</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">l </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> returnAnyValue();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">[[<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">print</span>
				<span style="COLOR: #000000">(</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">a:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">a</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> b:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">b</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> c:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">c</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> d:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">d</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> e:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">e</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> f:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">f</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> g:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">g</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> h:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">h</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> i:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">i</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> j:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">j</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> k:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">k</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> l:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">l</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> !</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />]]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">这样编译是出错的</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">提示告诉我们l为nil不能输出</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">所以我们把程序修改为<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">print</span>
				<span style="COLOR: #000000">(</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">a:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">a</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> b:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">b</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> c:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">c</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> d:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">d</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> e:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">e</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> f:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">f</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> g:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">g</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> h:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">h</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> i:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">i</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> j:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">j</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> k:</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">..</span>
				<span style="COLOR: #000000">k</span>
				<span style="COLOR: #000000">..</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000"> !</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />结果如下</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   a</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">1</span>
				<span style="COLOR: #000000"> b</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">2</span>
				<span style="COLOR: #000000"> c</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">3</span>
				<span style="COLOR: #000000"> d</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">4</span>
				<span style="COLOR: #000000"> e</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">1</span>
				<span style="COLOR: #000000"> f</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">2</span>
				<span style="COLOR: #000000"> g</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">3</span>
				<span style="COLOR: #000000"> h</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">1</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">2</span>
				<span style="COLOR: #000000"> j</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">3</span>
				<span style="COLOR: #000000"> k</span>
				<span style="COLOR: #000000">:</span>
				<span style="COLOR: #800000">4</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>
				<br />虽然我们不能输出L的值,但是我们根据错误提示可以知道l的值是nil的.</p>
		<p>论述完返回值,那么我们要看参数数了,LUA支持可变参数的模式的使用的方法和C语言的差不多,不熟悉的可以先学C语言,毕竟我看到的LUA大多数都是嵌入C中的,所以C/C++至少你要会.<br /><br />好了我们要进入我觉得比较难的点:闭包<br /><br />在我接触的编程语言里,其实还没发现过闭包的概念,坦白的说一句,就是LUA我才接触闭包的.闭包从网上的资料来看,就是JAVASCRIPT里的匿名函数的使用(我接触新语言的时候,总喜欢用自己接触过的语言去进行对比,去学习.我觉得这种学习的方法还是比较有效果的,有兴趣的朋友也可以试试这个方法.),在我看了网上公开的闭包程序,最大的特点就是使用,外面的函数有自己的局部变量,内部的匿名函数使用了外部函数的局部变量.有点像面向对象思想里的意思,后来我在LUA的一个论坛看到一篇关于闭包的定义,如下:<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">当一个函数内部嵌套另一个函数定义时，内部的函数体可以访问外部的函数的局部变量，这种特征我们称作词法定界。虽然这看起来很清楚，事实并非如此，词法定界加上第一类函数在编程语言里是一个功能强大的概念，很少语言提供这种支持。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="FONT-FAMILY: 宋体">技术上来讲，闭包指值而不是指函数，函数仅仅是闭包的一个原型声明</span><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>这个是我在网上找的一个关于闭包的例子,个人感觉水平有限.可能使用网上的例子更有说服力<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">下面看一个简单的例子，假定有一个学生姓名的列表和一个学生名和成绩对应的表；现在想根据学生的成绩从高到低对学生进行排序，可以这样做：<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />names </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> {</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">Peter</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">Paul</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">Mary</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />grades </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> {Mary </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">10</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> Paul </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">7</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> Peter </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">8</span>
				<span style="COLOR: #000000">}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />table</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #0000ff">sort</span>
				<span style="COLOR: #000000">(names</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> function (n1</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> n2)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> grades[n1] </span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> grades[n2]    </span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000"> compare the grades<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="FONT-FAMILY: 宋体">假定创建一个函数将上面的功能包装起来</span><p class="AltD" style="BACKGROUND: rgb(237,231,220); MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: blue">   function</span><span lang="EN-US"> sortbygrade (names, grades)</span></p><p class="AltD" style="BACKGROUND: #fff; MARGIN: 0cm 0cm 0pt"><span lang="EN-US">       table.sort(names, <span style="COLOR: blue">function</span> (n1, n2)</span></p><p class="AltD" style="BACKGROUND: rgb(233,240,220); MARGIN: 0cm 0cm 0pt"><span lang="EN-US">          <span style="COLOR: blue">return</span> grades[n1] &gt; grades[n2]    <span style="COLOR: green">-- compare the grades</span></span></p><p class="AltD" style="BACKGROUND: #fff; MARGIN: 0cm 0cm 0pt"><span lang="EN-US">    <span style="COLOR: blue">end</span>)</span></p><p class="AltD" style="BACKGROUND: rgb(255,244,239); MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: blue">end</span><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="FONT-FAMILY: 宋体">例子中包含在</span><span lang="EN-US">sortbygrade</span><span style="FONT-FAMILY: 宋体">函数内部的</span><span lang="EN-US">sort</span><span style="FONT-FAMILY: 宋体">中的匿名函数可以访问</span><span lang="EN-US">sortbygrade</span><span style="FONT-FAMILY: 宋体">的参数</span><span lang="EN-US">grades</span><span style="FONT-FAMILY: 宋体">，在匿名函数内部</span><span lang="EN-US">grades</span><span style="FONT-FAMILY: 宋体">不是全局变量也不是局部变量，我们称作外部的局部变量（</span><span lang="EN-US">external local variable</span><span style="FONT-FAMILY: 宋体">）或者</span><span lang="EN-US">upvalue</span><span style="FONT-FAMILY: 宋体">。（</span><span lang="EN-US">upvalue</span><span style="FONT-FAMILY: 宋体">意思有些误导，然而在</span><span lang="EN-US">Lua</span><span style="FONT-FAMILY: 宋体">中他的存在有历史的根源，还有他比起</span><span lang="EN-US">external local variable</span><span style="FONT-FAMILY: 宋体">简短）。</span></p></span>
		</div>
		<p>
				<br />这个例子主要说明的是在外部函数和内部函数之见参数的使用,函数中就可以直接用变量进行传值,这里需要说明一下的是table<span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">sort</span><span style="COLOR: #000000">(存放元素的数组,排序函数)具体的等后面我介绍常用库的时候说.只要知道是表排序就好.<br /><br />函数就写出来的,但是我们需要更直观的看到这些资料<br />所以我在最下面加上了如下代码</span></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">print</span>
				<span style="COLOR: #000000">(</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">---------</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />sortbygrade (names</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> grades);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> v in pairs(names) </span>
				<span style="COLOR: #0000ff">do</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">print</span>
				<span style="COLOR: #000000">(names[v])<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end</span>
		</div>输出结果为<br /><span style="FONT-WEIGHT: bold; COLOR: #000000">Mary<br /></span><span style="FONT-WEIGHT: bold; COLOR: #000000">Peter<br /></span><span style="FONT-WEIGHT: bold; COLOR: #000000">Paul</span><br />我将grades = {Mary = 7, Paul = 8, Peter = 9}改了再看效果<span style="FONT-WEIGHT: bold; COLOR: #000000"><br /><span style="FONT-WEIGHT: bold; COLOR: #000000"><span style="FONT-WEIGHT: bold; COLOR: #000000">Peter</span><br /></span><span style="FONT-WEIGHT: bold; COLOR: #000000">Paul<br /><span style="FONT-WEIGHT: bold; COLOR: #000000"><span style="FONT-WEIGHT: bold; COLOR: #000000">Mary</span></span></span></span><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">function newCounter()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">local</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> function()     </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"> anonymous function<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> i<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />c1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> newCounter()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(c1())  </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(c1())  </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">2</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(c1())  </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">3</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />结果代码里已经显示了,我就不说了,但是大家看到这个结果?你想到了什么?<br />对象?就是对象,看以下C#代码<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> CC<br /><img id="Codehighlighter1_16_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_165_Open_Text.style.display='none'; Codehighlighter1_16_165_Closed_Image.style.display='inline'; Codehighlighter1_16_165_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_16_165_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_165_Closed_Text.style.display='none'; Codehighlighter1_16_165_Open_Image.style.display='inline'; Codehighlighter1_16_165_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_16_165_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_16_165_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> CC()<br /><img id="Codehighlighter1_58_76_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_76_Open_Text.style.display='none'; Codehighlighter1_58_76_Closed_Image.style.display='inline'; Codehighlighter1_58_76_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_58_76_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_58_76_Closed_Text.style.display='none'; Codehighlighter1_58_76_Open_Image.style.display='inline'; Codehighlighter1_58_76_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_58_76_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_58_76_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> newCounter()<br /><img id="Codehighlighter1_111_163_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_163_Open_Text.style.display='none'; Codehighlighter1_111_163_Closed_Image.style.display='inline'; Codehighlighter1_111_163_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_111_163_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_163_Closed_Text.style.display='none'; Codehighlighter1_111_163_Open_Image.style.display='inline'; Codehighlighter1_111_163_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_111_163_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_111_163_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.a</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       retrun </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.a;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />如果LUA代码里C1=newCounter();C2=newCounter()<br /> print(c2())---&gt;1<br />是不是跟我们声明一个对象十分的类似呢?所以我推断闭包在一定程度上实现了部分面向对象的功能,肯定有一定的差别的,我只是说类似..而且我看代码有点像C语言去实现面向对象的感觉...<br /><br />闭包还可以实现类似JAVA里沙箱的功能,(来自网上,我并没有运行这段代码)<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">do<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    local oldOpen </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> io.</span><span style="COLOR: #0000ff">open</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    io.</span><span style="COLOR: #0000ff">open</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> (filename, mode)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> access_OK(filename, mode) </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> oldOpen(filename, mode)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> nil, "access denied"<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />*正确的尾调用<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">这个迷宫游戏是典型的状态机，每个当前的房间是一个状态。我们可以对每个房间写一个函数实现这个迷宫游戏，我们使用尾调用从一个房间移动到另外一个房间。一个四个房间的迷宫代码如下：<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> room1 ()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    local move </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> io.</span><span style="COLOR: #0000ff">read</span><span style="COLOR: #000000">()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "south" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room3()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    elseif move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "east" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room2()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">("invalid move")<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room1()   </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080"> stay in the same room</span><span style="COLOR: #008080"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> room2 ()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    local move </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> io.</span><span style="COLOR: #0000ff">read</span><span style="COLOR: #000000">()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "south" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room4()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    elseif move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "west" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room1()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">("invalid move")<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room2()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> room3 ()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    local move </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> io.</span><span style="COLOR: #0000ff">read</span><span style="COLOR: #000000">()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "north" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room1()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    elseif move </span><span style="COLOR: #808080">==</span><span style="COLOR: #000000"> "east" </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room4()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">("invalid move")<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> room3()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> room4 ()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">("congratilations!")<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />我们可以调用room1()开始这个游戏。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />如果没有正确的尾调用，每次移动都要创建一个栈，多次移动后可能导致栈溢出。但正确的尾调用可以无限制的尾调用，因为每次尾调用只是一个goto到另外一个函数并不是传统的函数调用<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>(以上代码来源网上)<br />正确尾调用论述的意义在于..栈溢出的问题,不正确的尾调用是存在栈溢出问题的.<br /><br />这篇写的我自己都不是很满意...因为这个东西..需要点时间消化...等我消化了再来整理一下,就好象开头,我也是一个LUA新手,我只能把我认识的弄出来,而且正确上..也非绝对..其实我的目的只是传播我的学习的思想.<br /><br /><a href="/AthrunOnline/">明鏡臺</a><img src ="http://www.cppblog.com/AthrunOnline/aggbug/82943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AthrunOnline/" target="_blank">梁乔峰</a> 2009-05-14 13:14 <a href="http://www.cppblog.com/AthrunOnline/archive/2009/05/14/82943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua学习之入门(二)----基础语法2</title><link>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82687.html</link><dc:creator>梁乔峰</dc:creator><author>梁乔峰</author><pubDate>Tue, 12 May 2009 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82687.html</guid><wfw:comment>http://www.cppblog.com/AthrunOnline/comments/82687.html</wfw:comment><comments>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AthrunOnline/comments/commentRss/82687.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AthrunOnline/services/trackbacks/82687.html</trackback:ping><description><![CDATA[<p>1、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl04_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/11/82583.html"><font color="#4371a6">lua学习之入门(一)----环境搭建</font></a><br /><br />2、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl02_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82640.html"><font color="#4371a6">lua学习之入门(二)----基础语法1</font></a><br /><br />3、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82687.html"><font color="#4371a6">lua学习之入门(二)----基础语法2</font></a><br /><br />4、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl02_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/14/82943.html"><font color="#4371a6">lua学习之入门(三)----函数</font></a><br /><br />      编程语言之所以叫做语言,因为它具有语言的特性,我们回忆一下学英语的过程,首先是学ABC字母,然后是单词,然后是句子,最后到文章..其实编程语言也具有这样的特性,标识符等于"字母",值和变量还有API等于"单词",语句块或函数,甚至是类等于"句子",一个程序就是一篇"文章"..今天我学习的是"句子",也就是语句块.<br /><br />        在LUA里语句块是由以下几个构成的<br /><br />第一:   语句组<a name="2.4.1">Chunk</a>s   </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">chunk ::</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> {stat [`;´]}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />这儿不允许有空的语句段，所以 </span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #800000">;;</span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #000000"> 是非法的。 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />lua 把一个 chunk 当作一个拥有不定参数的匿名函数（参见 §</span>
				<span style="COLOR: #000000">2.5</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #000000">9</span>
				<span style="COLOR: #000000">）处理。正是这样，chunk 内可以定义局部变量，接收参数，并且返回值。 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />chunk 可以被保存在一个文件中，也可以保存在宿主程序的一个字符串中。当一个 chunk 被执行，首先它会被预编译成虚拟机中的指令序列，然后被虚拟机解释运行这些指令。 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />chunk 也可以被预编译成二进制形式；细节参考程序 luac。用源码形式提供的程序和被编译过的二进制形式的程序是可以相互替换的； Lua 会自动识别文件类型并做正确的处理。 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<br />在手册里,只有这简短的解析,对于一个初学者,其实真是很抽象(某XX教授:手册有名字给你叫手册,用来查不是用来学的..我曰:没有其他学习资料只有手册的时候,它就是最好的学习资料.你是教授,级别高,可以单看代码研究,偶水平差只能折腾手册!)<br /><br /><a name="2.4.1">Chunk</a>s其实是一个代名,<a name="2.4.1">Chunk</a>可以是简单的一句print("haha");也可以是一个函数外加一个输出,输入语句,甚至可以是一个文件,例如我们第一篇测试时候的test.lua....你可以简单的理解为<a name="2.4.1">Chunk</a>是统称..代表着一个由语句组成的集合..<br /><br />第二:语句块blocks <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">语句块是一列语句段；从语法上来说，一个语句块跟一个 chunk 相同： <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    block ::</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> chunk<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />一个语句块可以被显式的写成一个单独的语句段： <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    stat ::</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> do block end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />显式的语句块对于控制变量的作用范围很有用。有时候，显式的语句块被用来在另一个语句块中插入 </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> 或是 </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>代码块(语句块)：指一个控制结构内，一个函数体，或者一个<span lang="EN-US">chunk</span><span style="FONT-FAMILY: 宋体">（变量被声明的那个文件或者文本串）。<br /></span><br />第三:控制结构<br /><br /><font color="#ff0000">    注意:    <span style="FONT-FAMILY: 宋体">控制结构的条件表达式结果可以是任何值，</span><span lang="EN-US">Lua</span><span style="FONT-FAMILY: 宋体">认为</span><span lang="EN-US">false</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">nil</span></font><span style="FONT-FAMILY: 宋体"><font color="#ff0000">为假，其他值为真。</font><br /></span><br />        大学时候,老师跟我说,所有编程语言都是由三种结构组成,顺序结构,选择结构,循环结构.个人认为..这样设置的原因,和人的生活有很大关系,我们从生老病死,这个就是一个最简单的顺序结构.从生存到消失.人都需要的经历,但在生老病死的过程中我们又要面临选择..老爸老妈没得选择...你还没生,就是你还不存在,所以你没选择的权利,那么就是说选择是建立在已经存在的基础上的,所以编程就有了if(某某XX某某某)某某胜利..所以这个选择必须要是有选择前提的,如果这个选择是永远都没机会选择..(例如选择老母- -!没得选的)这个选择就没有了选择的意义了,还有循环,就是重复实现某事情,例如读书,7点起床然后上课,然后下课,然后冲凉,然后睡觉,然后又重复到7点起床然后上课,然后下课,然后冲凉,然后睡觉,然后又重复到7点起床..............,这就是一个循环.你必须重复地做某些事情的时候,就可以用循环这个结构是实现重复做某事.<br /><br />         既然人的一生都是用这三中结构描述的,程序的出现,目的就是帮助人,减轻人的工作量,做这些结构也就是编程语言中的原住民了.<br /><br />LUA的选择结构,貌似只有一种就是if<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">stat ::</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> exp then block {elseif exp then block} [</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> block] end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>简单的一句,就表明了,if-else支持嵌套elseif  写法有点像VB....<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> a</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000"> then  </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">超过10岁</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">小于10岁</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) <br />   end</span></div>这个就是一个简单的选择结构...有编程基础的一看就懂了.<br /><br />LUA的循环结构,有三种,分别是<strong>while</strong> exp <b>do</b> block <b>end </b>, <strong>repeat</strong> block <b>until</b> exp ,<strong>for</strong> Name `<b>=</b>´ exp `<b>,</b>´ exp [`<b>,</b>´ exp] <b>do</b> block <b>end<br /></b>1.<strong>while</strong> exp <b>do</b> block <strong>end <br /></strong><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> condition do<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    statements;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>2. <strong>repeat</strong> block <b>until</b> exp 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">repeat<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    statements;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />until conditions;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />有点类似do </span><span style="COLOR: #0000ff">while</span></div>3.for....在LUA里for是有两种情况,如果用C#来描述的话,LUA的for含盖了C#里的for和foreach两种,<br /><br />      数值for<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><p><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> var</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">exp1,exp2,exp3 do<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    loop</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">part<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />for将 从exp1（初始值）到exp2（终止值），exp3是一个变化跨度值, 执行loop</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">part。其中exp3可以省略，默认跨度默认为</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />和传统的for结构一样for(int i=0;i&lt;10;i++),只是在LUA里简化了很多;<br />例子:<br />   for i=10,1,-2 do</span></p><p><span style="COLOR: #000000">       print(i)</span></p><p><span style="COLOR: #000000">   end<br /><br />输出结果为;<br />10<br />8 <br />6<br />4 <br />2<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />有几点需要注意：<br /><span lang="EN-US">          1. </span><span style="FONT-FAMILY: 宋体">三个表达式只会被计算一次，并且是在循环开始前。</span><br /><span lang="EN-US">          2. </span><span style="FONT-FAMILY: 宋体">控制变量</span><span lang="EN-US">var</span><span style="FONT-FAMILY: 宋体">是局部变量自动被声明</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体">并且只在循环内有效</span><span lang="EN-US">.<br /></span>          <span lang="EN-US">3. </span><span style="FONT-FAMILY: 宋体">循环过程中不要改变控制变量的值，那样做的结果是不可预知的。如果要退出循环，使用</span><span lang="EN-US">break</span><span style="FONT-FAMILY: 宋体">语句</span><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></p></div><br />范型<span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体">循环：<br /></span><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> namelist </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> explist1 do block end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />这里和C</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">的foreach基本一样</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">c</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">:</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">foreach(DataRow ss </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> dataTbale.Rows)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">输出ss[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />LUA里<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />days </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Sunday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Monday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Tuesday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Wednesday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />              </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Thursday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Friday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Saturday</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> v </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> ipairs(days) do<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(days[v]);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />只要自己测试一下就知道结果了.<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />反正就是一个传统循环,一个迭代循环</span></div><br /><br />还需要补充一个语句就是break,和return<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">break语句用来退出当前循环（</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">、repeat、</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">）。在循环外部不可以使用。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />return用来从函数返回结果，当一个函数自然结束时，结尾会有一个默认的return。（这种函数类似pascal的过程（procedure））<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />Lua语法要求break和return只能出现在block的结尾一句（也就是说：作为chunk的最后一句，或者在end之前，或者else前，或者until前），例如：<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />local i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> a[i] do<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> a[i] </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> v then </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000"> end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />有时候为了调试或者其他目的需要在block的中间使用return或者break，可以显式的使用do..end来实现：<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />function foo ()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">            </span><span style="COLOR: #000000">--&lt;&lt;</span><span style="COLOR: #000000"> SYNTAX ERROR<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">return</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> the last statement </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> the next block<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    do </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> end        </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"> OK<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    <img src="http://www.cppblog.com/images/dot.gif" />               </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"> statements </span><span style="COLOR: #0000ff">not</span><span style="COLOR: #000000"> reached<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />基本的结构我们都学习完了,学到这里我们基本的LUA都能看懂了,也不能算懂,起码知道LUA的大概意思了,基础语法(完)<br /><br /><br /><a href="/AthrunOnline/">明鏡臺</a><br /><img src ="http://www.cppblog.com/AthrunOnline/aggbug/82687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AthrunOnline/" target="_blank">梁乔峰</a> 2009-05-12 14:50 <a href="http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua学习之入门(二)----基础语法1</title><link>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82640.html</link><dc:creator>梁乔峰</dc:creator><author>梁乔峰</author><pubDate>Mon, 11 May 2009 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82640.html</guid><wfw:comment>http://www.cppblog.com/AthrunOnline/comments/82640.html</wfw:comment><comments>http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82640.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/AthrunOnline/comments/commentRss/82640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AthrunOnline/services/trackbacks/82640.html</trackback:ping><description><![CDATA[<p>1、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl04_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/11/82583.html"><font color="#4371a6">lua学习之入门(一)----环境搭建</font></a><br /><br />2、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl02_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82640.html"><font color="#4371a6">lua学习之入门(二)----基础语法1</font></a><br /><br />3、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82687.html"><font color="#4371a6">lua学习之入门(二)----基础语法2</font></a><br /><br />4、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl02_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/14/82943.html"><font color="#4371a6">lua学习之入门(三)----函数</font></a><br /><br /><br />     学习LUA第6个小时了,这是第2篇文章,也是我今天学习的最后总结了,LUA我也是个初学者,我目标只是想尽可能的把自己学习的一些想法表现出来.可能写的没有那些大虾们好,大虾们的生动.但至少是我个人的写作,本人很不喜欢转载的,转载不如直接去别人BLOG看..再一次声明..我是LUA初学者,一个初学者写给初学者的....废话不说..入正题.<br /><br />     <br />        任何语言,首先要明白的是 <em>标识符 </em>的命名规则,LUA的规则和C语言的没太大分别都是由:字母,数字,下划线组成,而且不能以数字开头..貌似我会的编程语言都是这样的规定..   这个没啥技术难度....靠死记的..<br />        LUA的字符串表示是可以用单引号或者双引号的...这点跟JAVASCRIPT是一样的,<br />        在LUA手册里有一段这样的东西<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">     a </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #800000">alo\n123"</span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     a </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">"</span>
				<span style="COLOR: #800000">alo\n123\</span>
				<span style="COLOR: #800000">""<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">     a </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #800000">\97lo\10\04923"</span>
				<span style="COLOR: #800000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     a </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> [[alo<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     </span>
				<span style="COLOR: #000000">123</span>
				<span style="COLOR: #800000">"</span>
				<span style="COLOR: #800000">]]</span>
				<span style="COLOR: #800000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">     a </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> [</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">[<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     alo<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     </span>
				<span style="COLOR: #000000">123</span>
				<span style="COLOR: #800000">"</span>
				<span style="COLOR: #800000">]==]</span>
				<span style="COLOR: #800000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>手册里的解释是这样的<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">字符串还可以用一种长括号括起来的方式定义。我们把两个正的方括号间插入 n 个等号定义为第 n 级正长括号。就是说，0 级正的长括号写作 [[ ，一级正的长括号写作 [</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">[ ，如此等等。反的长扩展也作类似定义；举个例子，</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"> 级反的长括号写作 ]</span><span style="COLOR: #000000">====</span><span style="COLOR: #000000">] 。一个长字符串可以由任何一级的正的长括号开始，而由第一个碰到的同级反的长括号结束。整个词法分析过程将不受分行限制，不处理任何转意符，并且忽略掉任何不同级别的长括号。这种方式描述的字符串可以包含任何东西，当然特定级别的反长括号除外。 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />另一个约定是，当正的长括号后面立即跟了一个换行符，这个换行符就不包含在这个字符串内。举个例子，假设一个系统使用 ASCII 码（这时，</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">a</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> 编码为 </span><span style="COLOR: #000000">97</span><span style="COLOR: #000000"> ，换行符编码为 </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000"> ，</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">1</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> 编码为 </span><span style="COLOR: #000000">49</span><span style="COLOR: #000000"> ），下面五种方式描述了完全相同的字符串： <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />很别扭啊手册里的介绍是这个a所代表的字符串显示都是一样的...感觉犯晕啊...<br /><br />手册例子想表达的意思我解析一下,<br />a = 'alo\n123"'  这个字符串是用单引号括起来的,123后面跟了个".....想表达的意思就是说,如果用单引号作为字符串的引用的话,内部的双引号做双引号处理,<br />a = "alo\n123\"" 这个字符串则是用双引号括起来的,为了解决冲突,就要使用转义字符\"去代表"<br />a = '\97lo\10\04923"'  这个其实就是ASCII码转义而已..<br />最令人犯晕的是下面.. 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> [</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">[<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />alo<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">123</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">]==]</span></div>这个想表达啥呢?其实这个作用和C#里的@""有点类似..有点像格式输出吧,,<br />里面的思想有个灵活的配对,"[["  在手册里有个名字,叫长括号,而在"[==["中间的等号个数代表多少级的长括号,没有等号为0级,1个等号为1级,类推下去.<br /><br />开始在代码里,我以为这里"级"的意义在于这个字符串占多少行的意思,但是经过我代码的测试原来没任何关系..<br />依照我这个初学者的猜测...设置这些的意义,目的就是一个避免字符串内过多的使用转义字符吧,LUA的目标是要做嵌入脚本语言,<br />例如有个游戏的对白, 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">小孩说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">很牛啊</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />牛说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">不牛</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />牛说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">]]</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />小孩说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">]=]</span><span style="COLOR: #800000">"</span></div>将以上字符<br />a=[==[<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">小孩说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">很牛啊</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />牛说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">不牛</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />牛说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">]]</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />小孩说:</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">]=]</span><span style="COLOR: #800000">"]==]<br /></span>这样在[==[里就可以使用任何的字符串表达符,提供了更大的灵活性.<br /><br /><br />后来我咨询了下LUA高手他给我的答复如下<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><font style="BACKGROUND-COLOR: #ffffff">这个是5.1版本新加的功能,我想主要的作用是屏蔽转义字符的作用的,在5.0的时候,我们写lua都需要自己可意去回避一些转义字符..这个只是我个人想法,你可以问问其他人,目前我实际应用的开发都是5.0居多,这个是5.1新加的,我也不是很确定,但照字面意思..就算不全对,也差不多了</font></div><br />看来我的猜想是正确的.<br /><br /><br />变量<br /><br />LUA称为脚本语言,那么就注定了他的变量是弱类型的,就是说变量没有类型,至少我认识的脚本语言JAVASCRIPT就是没类型的.所以姑且把脚本语言定义为变量没有类型的语言就是脚本语言...(某XX教授:你丫的乱下定义误人子弟!..纯粹是帮助记忆...别教真...别教真).<br />                                     <font size="6">变量没有类型,有类型的只是值 (脚本语言的特点)</font>         <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Lua 中有八种基本类型： nil, boolean, number, string, function, userdata, thread, </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> table. Nil 类型只有一种值 nil ，它的主要用途用于标表识和别的任何值的差异；通常，当需要描述一个无意义的值时会用到它。 Boolean 类型只有两种值：false 和 true。 nil 和 false 都能导致条件为假；而另外所有的值都被当作真。 Number 表示实数（双精度浮点数）。（编译一个其它内部数字类型的 Lua 解释器是件很容易的事；比如把内部数字类型改作单精度浮点数或长整型。参见文件 luaconf.h 。） String 表示一串字符的数组。 Lua 是 </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">bit clean 的：字符串可以包含任何 </span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"> 位字符，包括零结束符 (</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">\0</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">) </span></div><br /><em>userdata</em> 类型用来将任意 C 数据保存在 Lua 变量中。这个类型相当于一块原生的内存，除了赋值和相同性判断，Lua 没有为之预定义任何操作。然而，通过使用 <em>metatable （元表）</em> ，程序员可以为 userdata 自定义一组操作. userdata 不能在 Lua 中创建出来，也不能在 Lua 中修改。这样的操作只能通过 C API。这一点保证了宿主程序完全掌管其中的数据。<br /><br />大家都知道,C语言里有几个特别的数据构造,例如,结构体,共用体等,这个<em>userdata</em> 类型其实就满足结构体传值的功能的数据类型,至少我现在是这样理解的..至于元表我还没有接触,暂时将<em>userdata</em> 类型等同于一个只读类型.<br /><br />Lua 中有三类变量：全局变量，局部变量，还有 table 的域。 其实今天大多的时候都花费在字符串里,但是一种语言来说,字符也是一个很重要的重点,例如C#基本提供了每个类都是 ToString()方法,C语言,单独用一章介绍字符串,数据结构里也独立一个章专门说字符串,所以这个字符串是在我们日常开发中经常用到的,对它理解得深其实是有好处的...今天就到这里<br /><br /><a href="/AthrunOnline/">明鏡臺</a><br /><img src ="http://www.cppblog.com/AthrunOnline/aggbug/82640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AthrunOnline/" target="_blank">梁乔峰</a> 2009-05-12 00:20 <a href="http://www.cppblog.com/AthrunOnline/archive/2009/05/12/82640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua学习之入门(一)----环境搭建</title><link>http://www.cppblog.com/AthrunOnline/archive/2009/05/11/82583.html</link><dc:creator>梁乔峰</dc:creator><author>梁乔峰</author><pubDate>Mon, 11 May 2009 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/AthrunOnline/archive/2009/05/11/82583.html</guid><wfw:comment>http://www.cppblog.com/AthrunOnline/comments/82583.html</wfw:comment><comments>http://www.cppblog.com/AthrunOnline/archive/2009/05/11/82583.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/AthrunOnline/comments/commentRss/82583.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AthrunOnline/services/trackbacks/82583.html</trackback:ping><description><![CDATA[<p align="left">绝对原创<br /><br />1、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl04_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/11/82583.html"><font color="#4371a6">lua学习之入门(一)----环境搭建</font></a><br /><br />2、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl02_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82640.html"><font color="#4371a6">lua学习之入门(二)----基础语法1</font></a><br /><br />3、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/12/82687.html"><font color="#4371a6">lua学习之入门(二)----基础语法2</font></a><br /><br />4、<a class="postTitle2" id="_ee331ba0f13_HomePageDays_DaysList_ctl02_DayItem_DayList_ctl00_TitleUrl" href="/AthrunOnline/archive/2009/05/14/82943.html"><font color="#4371a6">lua学习之入门(三)----函数</font></a><br /><br />要学习编程,必须的一肯定是编译工具,和一些调试工具,我使用的Lua-5.1.4下载地址:<a title="Lua 5.1.4版文件包" href="http://www.lua.org/ftp/lua-5.1.4.tar.gz">http://www.lua.org/ftp/lua-5.1.4.tar.gz</a>,<br /><br />接触未知道的东西应该怎么做,肯定是找GOOGLE咯,一搜索....网上教我是这样做的的:<br /><br />(来自<a href="http://bbs.luaer.cn/read-Lua-tid-105.html">http://bbs.luaer.cn/read-Lua-tid-105.html</a>)<br /><font size="2">（1） 下载Lua压缩包，下载页面是</font><a href="http://www.lua.org/download.html" target="_blank"><font size="2">http://www.lua.org/download.html</font></a><font size="2"> 最新版本是<span style="COLOR: #ff0000">lua-5.1.2</span></font><br /><font size="2">也可以点击这里直接下载：</font><a href="http://www.lua.org/ftp/lua-5.1.2.tar.gz" target="_blank"><font size="2">http://www.lua.org/ftp/lua-5.1.2.tar.gz</font></a><font size="2">  它的体积很小，只有210K</font><br /><font size="2">（2）解压文件，比如解压到 <b><span style="COLOR: #ff6600">D:/lua-5.1.2</span></b> 文件夹内<span style="COLOR: #ff0000">（以下均以此路径为例）。</span></font><br /><font size="2">（3）在 <span style="COLOR: #ff6600"><b>D:/lua-5.1.2</b></span>内，存在名为 <span style="COLOR: #ff6600"><b>/etc</b><span style="COLOR: #000000">的子目录。在此目录下找到 <span style="COLOR: #ff6600"><b>luavs.bat </b></span>文件，并将它复制到 <span style="COLOR: #ff6600"><b>D:/lua-5.1.2 </b></span><span style="COLOR: #000000">中。</span></span></span></font><br /><font size="2">（4）双击执行 <span style="COLOR: #ff6600"><b>luavs.bat </b></span>批处理文件，如果执行成功，在 <span style="COLOR: #ff6600"><b>D:/lua-5.1.2/src</b></span> 文件夹中会存在 <span style="COLOR: #ff6600"><b>luac.exe </b></span>和<span style="COLOR: #ff6600"><b> lua.exe</b></span>两个文件。</font><br /><font size="2">（5）将 <b><span style="COLOR: #ff6600">D:/lua-5.1.2/src</span></b> 加入到系统路径中。</font><br /><font size="2">（6）检测Lua是否安装成功：</font><br /><font size="2">在"<span style="COLOR: #0000ff"><b>开始</b></span>"--"<span style="COLOR: #0000ff"><b>运行</b></span>"处输入 <span style="COLOR: #ff0000"><b>lua</b></span> 然后回车，若出现cmd控制台界面且含有"[backcolor=rgb(255,]<span style="COLOR: #808080"><b>Lua 5.1.2</b></span>"之类的文字，则说明Lua已经成功安装。如果提示没有找到该命令，请检查<b><span style="COLOR: #ff6600">D:/lua-5.1.2/src</span></b> 文件夹中是否存在 <span style="COLOR: #ff6600"><b>luac.exe </b></span>和 <span style="COLOR: #ff6600"><b>lua.exe </b></span>两个文件，并确保已将 <b><span style="COLOR: #ff6600">D:/lua-5.1.2/src</span></b> 加入到系统路径中。<br /><br />教的是5.1.2,我用的是5.1.4....相对我这种初学者来说,没多大分别..<br />所以我照着做了....<br />运行<span style="COLOR: #ff6600"><b>luavs.bat </b></span></font><br /><br />一闪,完全不知道什么事情,打开E:\lua-5.1.4\src(我放在E盘).什么都没发生.好你有种你闪,我就不让你闪,我-&gt;开始-&gt;运行 CMD -&gt;E: -&gt; CD E:\lua-5.1.4-&gt;luavs.bat/得到的结果....LINK失败等一大堆信息.....突然脑袋一片空白...咋办...再试..认真看了出错信息..原来...这个BAT是一个起编译的作用的...我用我装的VS2008编译你试试吧!!死马当活马医,开始-&gt;程序-&gt;Microsoft Visual Studio 2008-&gt;Visual Studio Tools-&gt;Visual Studio 2008 命令提示 输入CD E:\lua-5.1.4-&gt;E:-&gt;luavs.bat<br />    OK....成功生成luac.exe,lua.exe....进行下一步打开环境变量-&gt;系统变量-&gt;Path加上E:\lua-5.1.4\SRC再去 CMD里,输入LUA.....得到以下结果是LUA的版权信息...很好证明环境已经成功搭建....我们可以开始下一步工作...<br /><br />然后我们在记事本下编写一个<br />print("-----------------------------");<br />print("测试LUA~~~梁乔峰2009");<br />print("-----------------------------");<br />并保存为test.lua<br />然后在CMD下运行 lua h:\test.lua<br /><br />----------------------------------------<br />测试LUA~~~梁乔峰2009<br />----------------------------------------<br /><br />GOOD JOB.......我们终于成功地跑起第一个LUA了,激动吧!!<br /><br /><a href="/AthrunOnline/">明鏡臺</a></p><img src ="http://www.cppblog.com/AthrunOnline/aggbug/82583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AthrunOnline/" target="_blank">梁乔峰</a> 2009-05-11 16:30 <a href="http://www.cppblog.com/AthrunOnline/archive/2009/05/11/82583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>