Lua语言精简教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lua的不足
• Lua语言本身不支持面向对象的设计 Lua语言本身不支持面向对象的设计 • Lua是一个很需要DIY的语言,没有大而全的库,很多功能 Lua是一个很需要DIY的语言,没有大而全的库, 是一个很需要DIY的语言 要程序员自己实现(XML,深拷贝等) (XML,深拷贝等 要程序员自己实现(XML,深拷贝等) • 缺乏一些方便高效的数据结构,如堆栈,队列等 缺乏一些方便高效的数据结构,如堆栈,
Lua的类型和值
• Lua是动态类型语言,变量不要类型定义(弱类型语言) Lua是动态类型语言 变量不要类型定义(弱类型语言) 是动态类型语言, • Lua中有8个基本类型:nil、boolean、number、string、 function、 Lua中有8个基本类型:nil、boolean、number、string、 function、 中有 table和 userdata、 table和 userdata、 thread
函数
• 闭包和upvalue 闭包和upvalue
function newCounter() local i = 0 return function() -- anonymous function i=i+1 return i end end c1 = newCounter() print(c1()) --> 1 print(c1()) –> 2 简单的说闭包是一个函数加上它可以正确访问的upvalues(一个闭包不能超过255个) (一个闭包不能超过 简单的说闭包是一个函数加上它可以正确访问的 个
Lua的语法结构
• 控制结构语句
– if语句
If a < 10 then … else … end
–
while语句
while a < 10 do … end
–
–
repeat语句 repeat … until a < 10 for语句 (数组循环和范型循环) for a=1, 10, 1 do for k,v in ipairs(t) do print(a) print(k) end end
Lua的语言特性
• Lua是一个小巧,简单,强大的脚本语言,使用方便,跨 Lua是一个小巧,简单,强大的脚本语言,使用方便, 是一个小巧 平台,容易和C/C++ C/C++整合扩展 平台,容易和C/C++整合扩展 • Lua提供的机制是C/C++不善于的:高级语言、动态结构、 Lua提供的机制是C/C++不善于的 高级语言、动态结构、 提供的机制是C/C++不善于的: 简洁、易于测试和调试等。 简洁、易于测试和调试等。 • Lua具有良好的安全保证,自动内存管理,简便的字符串 Lua具有良好的安全保证 自动内存管理, 具有良好的安全保证, 处理功能及其他动态数据的改变。 处理功能及其他动态数据的改变。 • Lua是脚本语言中最高效的 Lua是脚本语言中最高效的
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真 控制变量var(上例的a, k, v)是局部变量,自动被声明,并且只在循环内有效. Lua语法要求break和return只能出现在代码块(block)的结尾一句,可以用do..end来绕过
– – –
函数
• 语法表达 function func_name (arguments-list) statements-list; end; 例如: function add(a, b) return a + b end
函数
• 面向对象方式调用函数的语法
Player = {} function Player:cast(spell) self.mp = self.mp - 3 End 等同于 function Player.cast(self, spell) self.mp = self.mp - 3 end --self是一个约定的变量,表示省略声明的第一个函数参数
local a ---->初始化为nil a = true a=1 a=0.4 --默认情况下,lua的实现用双精度浮点来表示内部的number a = “hello lua” a = ‘hello lua\n hello world’ a = function(a) print(a) end ---------------------------------------------------------------------------------------a = {1, 2, 3, 4} a={1, ”test”, 2, false, {1,2,3,4}, ”nice”} print(a[1], a[2], a[3]) a = {name=“tom”, age=13,money=1000000} print(a.name, a[age], a.money) a = {“one”, name=“tom”, age=13, ”two”, money=1000000, ”three”} print(a[1], a[2], a[3], a.name, a[age], a.money)
– –
Lua的语法结构
• 赋值语句
a=1 a, b = 1, 2 a, b, c = 1, 2 ( c为nil ) a, b, c = 1, 2, 3, 4 ( 4忽略 )
• 注释
单行注释: ---注释1 local x = 1 --注释2 多行注释: --[[ --]] --[[ 注释1 注释2 注释3 -]] local x = 1
•
连接运算符
.. 连接符 字符串连接,如果操作数为数字,Lua将数字转成字符串 “hello” .. “world” .. 12435 ----> “helloworld12345”
Lua的语法结构
• 全局变量和局部变量
– – 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出 错,只不过得到的结果是:nil 局部变量用local声明,只在被声明的那个代码块(block)内有效。代码块:指一个控制结构内,一个函数体,或 者一个chunk(变量被声明的那个文件或者文本串),我们可以给代码块划定一个明确的界限:do..end内。 x = 10 local i = 1 -- local to the chunk while i<=x do local x = i*2 -- local to the while body print(x) --> 2, 4, 6, 8, ... i=i+1 end if i > 20 then local x -- local to the "then" body x = 20 else print(x) --> 10 (the global one) end do local x = 3 end Lua是大小写敏感的 可以用表作为命名空间,宏定义。如:math.floor, GameType.player,Actor.getType
function foo (x) return 2*x end 等同于 foo = function (x) return 2*x end -------------------------------------------------Creature={} function Creature:castSpell(spell) return true end 等同于 Creature.castSpell=function (self, spell) return true end 函数定义实际上是一个赋值语句,将类型为function的变量赋给一个变量。我们使 用function (x) ... end来定义一个函数和使用{}创建一个表一样
调用:
x, y = add(1, 2) x, y = add(nil, 2)
函数
• 可变参数
printResult = "" function print(...) local n = select(“#”, …) --得到可变参数个数 local args = {…} for i=1,n do printResult = printResult .. tostring(args[i]) .. "\t" end printResult = printResult .. "\n" end
Lua语言精简课程
徐宁
前言
• Lua是一个越来越重要的语言,在最新的编程语言排行榜 是一个越来越重要的语言, 是一个越来越重要的语言 上已经跃升到了第10位 它用途广泛,尤其是游戏行业, 上已经跃升到了第 位,它用途广泛,尤其是游戏行业, 几乎就是游戏开发的标准逻辑语言, 几乎就是游戏开发的标准逻辑语言,被众多知名游戏和引 擎所采用,比如:魔兽世界, 擎所采用,比如:魔兽世界,CryEngine等 等 • 本课程基本上是以 本课程基本上是以Programming in lua为蓝本的,希望可以 为蓝本的, 为蓝本的 帮助有编程基础的相关人员快速的了解这一门游戏开发语 也着重讲解一些Lua在开发应用中要注意的要点 在开发应用中要注意的要点, 言,也着重讲解一些 在开发应用中要注意的要点,如 果要更加全面系统的了解Lua编程 可以参阅Programming 编程, 果要更加全面系统的了解 编程,可以参阅 in lua这本经典的 这本经典的LUA编程书籍。 编程书籍。 这本经典的 编程书籍
迭代器与For循环
• 迭代器与闭包
迭代器常用来遍历集合的每一个元素。在Lua中我们常常使用函数(闭包)来描述迭代器,每次调 用该函数就返回集合的下一个元素。 为一个list写一个简单的迭代器,类似ipairs()
function list_iter (t) local i = 0 local n = table.getn(t) return function () i=i+1 if i <= n then return t[i] end end end t = {10, 20, 30} for v in list_iter(t) do --初始化得到迭代器,循环执行迭代器,得到返回值,nil退出循环 print(v) end
数据结构
• table是Lua中唯一的数据结构,其他语言所提供的其他数据结构比如:arrays、 table是Lua中唯一的数据结构,其他语言所提供的其他数据结构比如:arrays、 中唯一的数据结构 records、lists、queues、sets等 Lua可以通过table来实现 可以通过table来实现, records、lists、queues、sets等,Lua可以通过table来实现,但是只有 array,hashtable是高效的 因为table本质上就是array hashtable的自动管 是高效的, table本质上就是 array,hashtable是高效的,因为table本质上就是array + hashtable的自动管 理结构 数组
来自百度文库
Lua的运算符
• 算术运算符
二元运算符:+ - * / ^ (加减乘除幂) 一元运算符:- (负值)
•
关系运算符
<,>,<=,>=,==,~= Lua通过引用比较tables、userdata、functions,仅当两者表示同一个对象时相等(UINT64的 问题)
•
逻辑运算符 逻辑运算符
and 与 or 或 not 非
调用:p:cast(spell) 或 p.cast(p, spell)
--p:cast(spell)的调用方法默认传入p为第一个函数参数
•
返回多个结果值
function add(a, b) if a == nil then return 0, false else return a + b, true end end
• 通过引用调用可变参数的函数
f = string.find a = {“hello”, “ll”} --把可变参数放在一个Table里 print(f(unpack(a))) --unpack解包Table的参数作为函数参数传入
函数
• 理解 的函数定义(函数变量) 理解Lua的函数定义(函数变量) 的函数定义