当前位置:文档之家› Lua语言精简教程

Lua语言精简教程


函数
• 面向对象方式调用函数的语法
Player = {} function Player:cast(spell) self.mp = self.mp - 3 End 等同于 function Player.cast(self, spell) self.mp = self.mp - 3 end --self是一个约定的变量,表示省略声明的第一个函数参数
Lua语言精简课程
徐宁
前言
• Lua是一个越来越重要的语言,在最新的编程语言排行榜 是一个越来越重要的语言, 是一个越来越重要的语言 上已经跃升到了第10位 它用途广泛,尤其是游戏行业, 上已经跃升到了第 位,它用途广泛,尤其是游戏行业, 几乎就是游戏开发的标准逻辑语言, 几乎就是游戏开发的标准逻辑语言,被众多知名游戏和引 擎所采用,比如:魔兽世界, 擎所采用,比如:魔兽世界,CryEngine等 等 • 本课程基本上是以 本课程基本上是以Programming in lua为蓝本的,希望可以 为蓝本的, 为蓝本的 帮助有编程基础的相关人员快速的了解这一门游戏开发语 也着重讲解一些Lua在开发应用中要注意的要点 在开发应用中要注意的要点, 言,也着重讲解一些 在开发应用中要注意的要点,如 果要更加全面系统的了解Lua编程 可以参阅Programming 编程, 果要更加全面系统的了解 编程,可以参阅 in lua这本经典的 这本经典的LUA编程书籍。 编程书籍。 这本经典的 编程书籍
调用:
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是一个小巧,简单,强大的脚本语言,使用方便,跨 Lua是一个小巧,简单,强大的脚本语言,使用方便, 是一个小巧 平台,容易和C/C++ C/C++整合扩展 平台,容易和C/C++整合扩展 • Lua提供的机制是C/C++不善于的:高级语言、动态结构、 Lua提供的机制是C/C++不善于的 高级语言、动态结构、 提供的机制是C/C++不善于的: 简洁、易于测试和调试等。 简洁、易于测试和调试等。 • Lua具有良好的安全保证,自动内存管理,简便的字符串 Lua具有良好的安全保证 自动内存管理, 具有良好的安全保证, 处理功能及其他动态数据的改变。 处理功能及其他动态数据的改变。 • Lua是脚本语言中最高效的 Lua是脚本语言中最高效的
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[age], a.money) a = {“one”, name=“tom”, age=13, ”two”, money=1000000, ”three”} print(a[1], a[2], a[3], , a[age], a.money)
Lua的不足
• Lua语言本身不支持面向对象的设计 Lua语言本身不支持面向对象的设计 • Lua是一个很需要DIY的语言,没有大而全的库,很多功能 Lua是一个很需要DIY的语言,没有大而全的库, 是一个很需要DIY的语言 要程序员自己实现(XML,深拷贝等) (XML,深拷贝等 要程序员自己实现(XML,深拷贝等) • 缺乏一些方便高效的数据结构,如堆栈,队列等 缺乏一些方便高效的数据结构,如堆栈,
– –
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
数据结构
• 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是动态类型语言,变量不要类型定义(弱类型语言) Lua是动态类型语言 变量不要类型定义(弱类型语言) 是动态类型语言, • Lua中有8个基本类型:nil、boolean、number、string、 function、 Lua中有8个基本类型:nil、boolean、number、string、 function、 中有 table和 userdata、 table和 userdata、 thread
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来定义一个函数和使用{}创建一个表一样
迭代器与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
Lua的运算符
• 算术运算符
二元运算符:+ - * / ^ (加减乘除幂) 一元运算符:- (负值)

关系运算符
<,>,<=,>=,==,~= Lua通过引用比较tables、userdata、functions,仅当两者表示同一个对象时相等(UINT64的 问题)

逻辑运算符 逻辑运算符
and 与 or 或 not 非

连接运算符
.. 连接符 字符串连接,如果操作数为数字,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
调用:p:cast(spell) 或 p.cast(p, spell)
相关主题