程序员的Lua快速入门

  Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能.
   Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护.Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统平台上都可以编译,运行。[2] 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
 
  好了,废话不多说,这些资料都能从百度百科查询到。对于已经学习过其他开发语言的我们而言,学习lua只是试着去开发一个小游戏或者写一个脚本语言当后台使用,有了其他开发语言的基础,看开发帮助文档显得有点枯燥无味。下面我来讲讲lua的基本语法吧:
     
  基本结构使用VB的begin end方式,但是lua中花括号使用do end替代
 
     1>、变量的申明:
   lua没有明确的定义数据类型,所以可以直接类似javascript一样 name="张三";  分号可有可无,后面接语句则带上分号,全局变量要注意在前面加上local。lua是默认识别数据类型的值来判断数据类型的
     --8个基本变量   
  print(type("hello,world!"))     --string
  print(type(10.4*3))    --number
  print(type(print))    --function
  print(type(type))    --function
  print(type(true))    --boolean
  print(type(nil))    --nill
  print(type(type(x)))   --string
  print(type(a))    --string 'a' is not initialized (a没有初始化)
  a=10   print(type(a))      --string
  a=print  print(type(a))    --string a(type(a))
  2>、变量的赋值:
  

赋值是改变一个变量的值和改变表域的最基本的方法。

a = "hello" .. "world"

t.n = t.n + 1

Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x       <-->       a=10; b=2*x

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y'

a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[i]'

当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数 > 值的个数             按变量个数补足nil

b. 变量个数 < 值的个数             多余的值会被忽略

例如:

a, b, c = 0, 1

print(a,b,c)             --> 0   1   nill

a, b = a+1, b+1, b+2     -- value of b+2 is ignored

print(a,b)               --> 1   2

a, b, c = 0

print(a,b,c)             --> 0   nil   nil

上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值。

a, b, c = 0, 0, 0

print(a,b,c)             --> 0   0   0

多值赋值经常用来交换变量,或将函数调用返回给变量:

a, b = f()

f()返回两个值,第一个赋给a,第二个赋给b。

3>、循环结构:

for这个词我们并不陌生,在很多语言中这个单词很有作用,lua语言也一样,他可以被当做是迭代器使用也可以是当做循环语句使用

语法:for init,max/min value, increment  init do end是初始值,max/min value是最大最小值 increment代表增量

例如:for i=1,10,1  do
             num=math.random(1,8);   --生成随机数
             print(..num.."  ");  --输出随机数
        end

while循环  while(true) do print("This loop will run forever."); end   --这是一个死循环

当for被当做迭代器使用时(相当于foreach语句,基础中一般用不到)

  array = {"Lua", "Tutorial"}
  for key,value in ipairs(array)    --key:键,数组的键值,数组没有定义则默认使用索引  value:值,数据的值,没有定义使用nill ipairs(arrayname)代指数组指定
  do
     print(key, value)
  end    --输出为:0 Lua  1  Tutorial
4>、数组的定义
  
数组我们并不陌生,这里有三维数组的例子
  array = {}   maxRows = 3   maxColumns = 3   for row=1,maxRows do    for col=1,maxColumns do    array[row*maxColumns +col] = row*col    end   end   -- Accessing the array   for row=1,maxRows do    for col=1,maxColumns do    print(array[row*maxColumns +col])    end   end
  输出为1,2,3,2,4,6,3,6,9
  
正如在上面的例子中看到的,数据是基于索引储存的。也能够将元素以稀疏的方式,它是一个矩阵的工作方式lua的实现。因为它不保存在Lua零值,就可以节省大量的内存,
在Lua中任何特殊的技术相比其他编程语言中使用特殊技术
  5>、模块

    模块是一个像,可以使用需要加载并有包含表中的单个全局命名的库。该模块可包含若干函数和变量。所有这些函数和变量被包裹在以它作为一个命名空间的表。也是一个很乖的模块有必要的规定,返回此表上所需要的。

    表中的模块的使用可以帮助我们以多种方式,使我们能够操纵模块中我们操纵任何其他lua的表相同的方式。作为操纵模块的能力的结果,它提供了额外的功能的量等语言需要特殊的机制。由于lua模块,这个免费的方式下,用户可以调用Lua函数以多种方式。如下面几个:

  -- Assuming we have a module printFormatter
  -- Also printFormatter has a funtion simpleFormat(arg)
  -- Method 1
  require "printFormatter"
  printFormatter.simpleFormat("test")
  -- Method 2
  local formatter = require "printFormatter"
  formatter.simpleFormat("test")
  -- Method 3
  require "printFormatter"
  local formatterFunction = printFormatter.simpleFormat
  formatterFunction("test")

  在上面的示例代码中,可以看到如何灵活的编程Lua是没有任何特殊的额外的代码。

  Lua提供了一个名为规定加载所有必要的模块高级函数。它被保持尽可能的简单,以避免对模块太多的信息,以将其加载。该规定函数只是假定模块作为一个代码块定义一些值,这实际上是函数或者包含函数表。

  让我们考虑一个简单的例子,其中一个函数具有数学运算功能,并允许调用此模块作为mymath和文件名是mymath.lua。该文件的内容如下。

  local mymath =  {}
  function mymath.add(a,b)
     print(a+b)
  end
  function mymath.sub(a,b)
     print(a-b)
  end
  function mymath.mul(a,b)
     print(a*b)
  end
  function mymath.div(a,b)
     print(a/b)
  end
  return mymath	

  现在为了访问该lua模块中的另一个文件moduletutorial.lua,则如下所示。

  mymathmodule = require("mymath")
  mymathmodule.add(10,20)
  mymathmodule.sub(30,20)
  mymathmodule.mul(10,20)
  mymathmodule.div(30,20)

  为了运行这些代码,我们需要把在同一个目录下2 个lua文件,或者也可以放在包路径的模块文件,并需要产生额外的设置。当我们运行上面的程序,会得到下面的输出。

    20.10.200.1.5
  • 将模块在同一个目录下运行该文件。
  • 模块名称和它的文件名必须是相同的。
  • 这是返回模块规定函数,因此该模块也可以实现较好如上图所示,就算能找到其他类型的实现别的地方的最佳实践。

  现在重新编写相同的例子,其中使用包旧的方式。查看所有类型的实现。这是在使用Lua版本5.1和5.0。math模块如下所示。

  module("mymath", package.seeall)
  function mymath.add(a,b)
     print(a+b)
  end
  function mymath.sub(a,b)
     print(a-b)
  end
  function mymath.mul(a,b)
     print(a*b)
  end
  function mymath.div(a,b)
     print(a/b)
  end

  moduletutorial.lua模块的使用情况如下所示。

  require("mymath")
  mymath.add(10,20)
  mymath.sub(30,20)
  mymath.mul(10,20)
  mymath.div(30,20)

  当我们运行上面,我们会得到相同的输出。但建议在使用代码的旧版本,它被认为不太安全。使用Lua中像Corona SDK 编程的许多软件开发工具包已经过时

基本的内容就是这些,现在写一些小程序还是可以的,更多资料请参考http://www.yiibai.com/lua/lua_game_programing.html

 

posted @ 2015-04-09 11:00  维尔布里兹  阅读(870)  评论(0编辑  收藏  举报