程序员的Lua快速入门
赋值是改变一个变量的值和改变表域的最基本的方法。
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