lua快速入门

Lua语言简介

1993
年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lua语言正如它名字所预示的那样成长为一门简洁、优雅且富有乐趣的语言。

Lua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。Lua的每个版本都保持着开放源码的传统,不过各版采用的许可协议并不相同,自5.0版(最新版是5.1)开始她采用的是著名的MIT许可协议。正由于上述特点,所以Lua在游戏开发、机器人控制、分布式应用、图像处理、生物信息学等各种各样的领域中得到了越来越广泛的应用。其中尤以游戏开发为最,许多著名的游戏,比如Escape from Monkey Island、World of Warcraft、大话西游,都采用了Lua来配合引擎完成数据描述、配置管理和逻辑控制等任务。

作为一门过程型动态语言,Lua有着如下的特性:

1、变量名没有类型,值才有类型,变量名在运行时可与任何类型的值绑定;

2、语言只提供唯一一种数据结构,称为表(table),它类似key-value关联数组,可以用任何类型的值作为key和value。提供了一致且富有表达力的表构造语法,使得Lua很适合描述复杂的数据;

3、函数是一等类型,支持匿名函数和正则尾递归(proper tail recursion);

4、支持词法定界(lexical scoping)和闭包(closure);

5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;
6、运行期能编译字符串形式的程序文本并载入虚拟机执行;

7、通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic meta-mechanism),从而允许程序运行时根据需要改变或扩充语法设施的内定语义;

8、能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;

9、从5.1版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序;

Lua的语法类似PASCAL和Modula但更加简洁,所有的语法产生式规则(EBNF)不过才60几个。熟悉C和PASCAL的程序员一般只需半个小时便可
将其完全掌握。而在语义上Lua则与Scheme极为相似,她们完全共享上述的1、3、4、6点特性,Scheme的continuation与协程也基本相同只是自由度更高。最引人注目的是,两种语言都只提供唯一一种数据结构:Lua的表和Scheme的列表(list)。正因为如此,有人甚至称Lua为“只用表的Scheme”。

库和工具相比Java、Python、Perl,Lua的开源工具和库可能并不算多,但其中不乏优秀之作。以下介绍的资源均可在http://luausers.org/wiki/LuaAddons上找到,而且绝大多数都遵循着与Lua相同的许可协议。


lua作为很好的嵌入式语言可以非常好的作为c/c++补充,在游戏行业是得到了广泛的应用。

Lua能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。作为一个扩展式语言,Lua没有 "main" 程序的概念:它只能嵌入一个宿主程序中工作,这个宿主程序被称作embedding program或简称为host。宿主程序可以通过调用函数执行一小段Lua代码,可以读写Lua变量,可以注入C函数让Lua代码调用。这些扩展的C函数,可以大大的扩展了Lua可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。Lua的官方发布版就包含了一个叫做Lua的简单的宿主程序,它用Lua库提供了一个保证独立的Lua解释器。

很多网站宣传Lua语言作为脚本开发了《魔兽世界》,其实Lua语言只是开发了《魔兽世界》的插件,几乎所有的《魔兽世界》插件都是使用解释性的脚本Lua编写,核心的C++代码只占全部代码中的很小一部分比重。在传统平台上Lua最流行的应用场景是在游戏中作为处理逻辑的脚本,即用来编写游戏的任务脚本,以实现游戏的可配置性和可扩展性。在游戏中Lua脚本的加载不需重启服务器,尽管脚本的运行效率低于编译好的二进制代码,但目前CPU速度已完全能够让Lua脚本迅速解释执行。这也正是包括《魔兽世界》、《战锤40K》、《仙境传说》、《博德之门》和《轩辕剑外传汉之云》在内的众多游戏选择Lua开发插件的原因。

和Python等脚本不同,Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。不过Lua还是具备了比如数学运算和字符串处理等基本的功能。

一直在思考,能不能把他引入商业领域的规则语言呢?将业务规则经常变的部分提炼出来,而无须重新编译程序。作为规则引擎的角色进行使用。

使用前当然得安装一下去http://www.lua.org/下载一个 Lua_v5.1.4.23.exe安装,装完之后执行。

可以用 lua.exe逐行解释的方式,或者写完脚本用lExecutor.wlua执行

1)先来个helloworld

复制代码
>   print   ' helloWorld '
helloWorld
>   print ( " helloWorld " ) --注释是这么写的!
helloWorld
>  a = ' hello '
>   print (a)
hello
复制代码

2)主要类型

复制代码
>  a = 1
>  b = " abc "
>  c = {}
>  d = print
>
>   print ( type (a))
number
>   print ( type (b))
string
>   print ( type (c))
table
>   print ( type (d))
function
>
复制代码

  如上所示,lua主要有四种类型,即数字,字符串,table(其实理解可以理解为javascript的object),以及函数类型

当然了,还有最常的bool型了,true以及false,(这里不考虑nil,以及userdata,thread等)

函数类型的变量,加上"() "即可以执行,如

>  d(b)
abc

 3)变量及常量,字符串

复制代码
>  a,b,c,d  =   1 , 2 , ' c ' ,{ 1 }
>   print  (a,b,c,d)
1         2        c       table: 0041BC58
>  a = " single 'quoted' string and double \ " quoted\ "  string inside "
>  b = ' single \ ' quoted\ '  string and double "quoted" string inside '
>  c =   [[  multiple line
>> with'single'
>> and "double" quoted strings inside.
]]
>
>   print (a)
single 
' quoted '  string  and  double  " quoted "  string inside
>   print (b)
single 
' quoted '  string  and  double  " quoted "  string inside
>   print (c)
 multiple line
with
' single '
and   " double "  quoted strings inside. 
>  a=a.."看我给接上"  --字符串用两个..可以进行连接
>   print (a)
single 
' quoted '  string  and  double  " quoted "  string inside 看我给接上
复制代码

我们关注一下lua比较特别的地方

  • 声明变量及给变量赋值的时候,可以多变量一起赋值
  • 字符串常量可以用双引号及单引号,并且混用的时候无须转义字符,跟php有点类似,还可以用"[[]]"括起来,
    这一点类似于c#里面字符串可以加上@符号,可以保留字符串内的格式

 4)逻辑控制语句

复制代码
>  a = 10   -- 逻辑控制语句就不费口舌了 ,反正就这几个词,跟pl/sql有点像
>   if  a == 10   then
>>   print ( " 我是10 " )
>>   elseif  a ==   11   then
>>   print ( " 我是11 " )
>>   else
>>   print ( " 我是水户洋平等等 " )
>>   end
我是10
复制代码

5)循环结构


> --第一种while循环
> a=1
> while a~=10 do
>> io.write(a.."  ")
>> a=a+1
>> end
1  2  3  4  5  6  7  8  9  >
> --第二种repeat、until循环
> a=0
> repeat
>>      a=a+1
>>      print(a)
>> until a==5
1
2
3
4
5
> --第三种for循环
> for a=1,4 do
>>      io.write(a)
>> end
1234>
> --比较特别,有个步进的概念,如下是以2为步进
13> for a=1,4,2 do
>> io.write(a..' ')
>> end
1 3 > for a=1,5,2 do
>> io.write(a.. '  ')
>> end
1  3  5  >

6)函数及其使用

复制代码
>   -- 1.先来个最简单的
>   function  myFunc1()
>>        print ( " hello function " )
>>   end
>  myFunc1()
hello 
function
>   -- 2.再来个带参数的
>  a = 1
>  b = 2
>   function  myFunc2(par1,par2)
>>        return  par1 + par2
>>   end
>  c = myFunc2(a,b)
>   print (c)
3
>   -- 3.甚至可以返回多个变量
>  a = 1
>  b = 2
>   function  myFunc3(A,B)
>>        return  B,A
>>   end
>  c  =  myFunc3(a,b)  -- c会等于返回的第一个,在此倒转过来即为2
>   print (c)
2
>  c,d = myFunc3(a,b)  -- 当然如果给多个变量赋值就没有问题了
>   print (c,d)
2         1
>   print (myFunc3(a,b))  -- 直接打印就把所有打印出来
2         1
>   -- 4.还可以是变参
>   function  myFunc4()
>>   print ()
>>   end
>  myFunc4(a,b,c,d)
1         2         2         1
复制代码

 7)table(我觉得理解object也可以)的使用

复制代码
>  linbc = {} 
>  linbc.sex  =   " "
>  linbc.age  =   27
>   print (linbc,linbc.sex,linbc[ " age " ])
table: 0041ED50 男      
27
>  A = linbc
>   print (A[ " sex " ])

>   print (A)   -- 引用类型,看A以及linbc内存地址是一样的
table: 0041ED50
>    -- 瞧这用法,跟javascript的用法基本相当
>    -- 其实还可以理解为hashmap似的键值对
>   for  i,v  in   pairs (linbc)  do
>>      print (i,v)
>>   end
age     
27
sex     男
>    -- 也可以作为数组,下标是从1开始的喔
>  arr = { 1 , 2 , 3 , " a " , ' b ' ,linbc}
>   for  i,v  in   pairs (arr)  do
>>      print (i,v)
>>   end
1         1
2         2
3         3
4        a
5        b
6        table: 0041ED50
>    -- 既然作为数组吧,那肯定是可以增加记录的吧
>   table.insert (arr,A)
>  table.foreach(arr, function (i,v)  print (v)  end )
1
2
3
a
b
table: 0041ED50
table: 0041ED50
>   -- 瞧上面,可以foreach,还可以用匿名函数喔
>   -- 当然也可以用下标访问了
>   print (arr[ 1 ])
1
>   -- 调用table.insert会自动给增加下标,如
>   table.insert (linbc, " hello " )
>   print (arr[ 1 ])
1
复制代码

 

基本上lua是一门比较简洁的语言,感觉跟javascript like 80%,很轻量级


http://blog.163.com/swmwoaini@yeah/blog/static/10898942020095291166724/

http://www.centoscn.com/yunwei/Lua/2013/0820/1389.html

http://blog.csdn.net/user_920/article/details/8305991


很好的lua入门教程  《step by step lua》

http://www.cnblogs.com/stephen-liu74/archive/2012/07/30/2487201.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值