Lua语言精简教程

合集下载

Lua极简入门指南(一):基础知识篇

Lua极简入门指南(一):基础知识篇

Lua极简⼊门指南(⼀):基础知识篇本⽂是《Programming in Lua 3rd》读书笔记。

Chunks⼀个 Chunk 就是⼀组被执⾏的语句,例如⼀个⽂件或者交互模式下的⼀⾏。

标识符(identifiers)我们应该避免使⽤以 _ 开头并跟上⼀个或者多个⼤写字母的字符串来作标识符,它们被保留作特殊的⽤途(例如:_VERSION)。

注释单⾏注释使⽤复制代码代码如下:--多⾏注释使⽤复制代码代码如下:--[[ 和 --]]类型简介Lua 存在的数据类型包括:1.nil。

此类型只有⼀个值 nil。

⽤于表⽰“空”值。

全局变量默认为 nil,删除⼀个已经赋值的全局变量只需要将其赋值为 nil(对⽐ JavaScript,赋值 null 并不能完全删除对象的属性,属性还存在,值为 null)2.boolean。

此类型有两个值 true 和 false。

在 Lua 中,false 和 nil 都表⽰条件假,其他值都表⽰条件真(区别于 C/C++ 等语⾔的是,0 是真)3.number。

双精浮点数(IEEE 754 标准),Lua 没有整数类型4.string。

你可以保存任意的⼆进制数据到字符串中(包括 0)。

字符串中的字符是不可以改变的(需要改变时,你只能创建⼀个新的字符串)。

获取字符串的长度,可以使⽤ # 操作符(长度操作符)。

例如:print(#”hello”)。

字符串可以使⽤单引号,也可以使⽤双引号包裹,对于多⾏的字符串还可以使⽤ [[ 和 ]] 包裹。

字符串中可以使⽤转义字符,例如 \n \r 等。

使⽤ [[ 和 ]]包裹的字符串中的转义字符不会被转义erdata。

⽤于保存任意的 C 数据。

userdata 只能⽀持赋值操作和⽐较测试6.function。

函数是第⼀类值(first-class value),我们能够像使⽤其他变量⼀样的使⽤函数(函数能够保存在变量中,可以作为参数传递给函数)7.thread。

用Lua编写一个简易的弹珠游戏

用Lua编写一个简易的弹珠游戏

用Lua编写一个简易的弹珠游戏使用Lua编写一个简易的弹珠游戏弹珠游戏是一种经典的街机游戏,通过控制一根弹簧装置射出小球,并让小球反弹击中不同位置的目标来得分。

在本文中,我们将使用Lua 编写一个简单的弹珠游戏。

以下是游戏设计的步骤:1. 游戏背景设置在游戏中,我们需要创建一个游戏窗口,设置游戏背景和其他必要的元素。

我们可以使用Lua的图形库来实现这一点,例如使用`love.graphics`库。

2. 弹球设计在游戏中,弹球是一个重要的元素。

我们需要定义弹球的大小、颜色和初始位置。

我们还需要定义弹球的速度和运动方向。

使用Lua的变量来存储这些信息,并在游戏中使用。

3. 弹板设计弹板是玩家用来控制弹球的设备。

我们可以定义弹板的尺寸、颜色和位置。

可以使用键盘事件来控制弹板的移动,例如使用`love.keyboard`库。

4. 目标设计游戏中的目标是弹球可以击中的物体。

可以使用图形库来创建目标的形状和颜色。

我们可以定义多个目标,并在游戏中设置其初始位置和状态。

5. 游戏逻辑与碰撞检测在游戏中,我们需要检测弹球与弹板和目标之间的碰撞。

可以使用条件语句来检测碰撞,并根据碰撞结果来更新游戏状态。

例如,当弹球碰到目标时,玩家得分增加。

6. 分数系统和游戏结束在游戏中,我们需要实现一个分数系统,并在适当的时候显示玩家的得分。

当玩家无法击中目标时,游戏结束。

可以通过设置游戏状态并显示相关信息来实现游戏结束的效果。

7. 用户界面和音效为了增加游戏体验,我们可以在游戏中添加一些用户界面元素,例如开始菜单、暂停按钮和游戏结束画面。

我们还可以使用Lua的声音库来添加音效,例如弹球碰撞的声音效果。

以上是一个简易弹珠游戏的设计过程。

使用Lua编程语言,我们可以使用其丰富的库来实现游戏中所需的功能和效果。

通过编写相应的代码并按照设计步骤来组织代码结构,我们可以完成一个简单的弹珠游戏。

希望这篇文章对你有所帮助!。

Lua教程(二十二):userdata

Lua教程(二十二):userdata

Lua教程(⼆⼗⼆):userdata在Lua中可以通过⾃定义类型的⽅式与C语⾔代码更⾼效、更灵活的交互。

这⾥我们通过⼀个简单完整的⽰例来学习⼀下Lua 中userdata的使⽤⽅式。

需要说明的是,该⽰例完全来⾃于Programming in Lua。

其功能是⽤C程序实现⼀个Lua的布尔数组,以提供程序的执⾏效率。

见下⾯的代码和关键性注释。

复制代码代码如下:#include <lua.hpp>#include <lauxlib.h>#include <lualib.h>#include <limits.h>#define BITS_PER_WORD (CHAR_BIT * sizeof(int))#define I_WORD(i) ((unsigned int)(i))/BITS_PER_WORD#define I_BIT(i) (1 << ((unsigned int)(i)%BITS_PER_WORD))typedef struct NumArray {int size;unsigned int values[1];} NumArray;extern "C" int newArray(lua_State* L){//1. 检查第⼀个参数是否为整型。

以及该参数的值是否⼤于等于1.int n = luaL_checkint(L,1);luaL_argcheck(L, n >= 1, 1, "invalid size.");size_t nbytes = sizeof(NumArray) + I_WORD(n - 1) * sizeof(int);//2. 参数表⽰Lua为userdata分配的字节数。

同时将分配后的userdata对象压⼊栈中。

NumArray* a = (NumArray*)lua_newuserdata(L,nbytes);a->size = n;for (int i = 0; i < I_WORD(n - 1); ++i)a->values[i] = 0;//获取注册表变量myarray,该key的值为metatable。

Lua语言新手简单入门教程

Lua语言新手简单入门教程

Lua语⾔新⼿简单⼊门教程⼀、前⾔Lua 是⼀种轻量⼩巧的脚本语⾔,⽤标准 C 语⾔编写并以源代码形式开放,其设计⽬的是为了嵌⼊应⽤程序中,从⽽为应⽤程序提供灵活的扩展和定制功能。

Lua 可以应⽤在游戏开发、独⽴应⽤脚本、Web 应⽤脚本、扩展和数据库插件、安全系统等场景。

笔者学习的⽬的主要是为了能在 Web 应⽤(Nginx、Redis)中使⽤到 Lua 脚本。

特点Lua脚本可以很容易的被C/C++ 代码调⽤,也可以反过来调⽤C/C++的函数。

Lua由标准C编写⽽成,代码简洁优美,⼏乎在所有操作系统和平台上都可以编译,运⾏。

以极⼩的体积和简单的语法提供全⾯的功能。

[⼀个完整的Lua解释器不过200k,在⽬前所有脚本引擎中,Lua的速度是最快的]实现与宿主语⾔的简洁接⼝成为⼀个很容易嵌⼊其它语⾔中使⽤的语⾔。

特性⽀持⾯向对象编程轻量级可扩展函数式编程⾃动内存管理通⽤类型的表–table,可实现数组,哈希表,集合,对象⽀持闭包⽀持多线程⽀持交互式编程⼆、安装注意:请确保安装 Lua 之前系统已安装 readline 和 readline-devel。

如果没有则键⼊yum install -y readline readline-devel 进⾏安装。

curl -R -O /ftp/lua-5.3.4.tar.gztar zxf lua-5.3.4.tar.gzcd lua-5.3.4make linux test测试,命令⾏中键⼊ lua -v:Lua 5.1.4 Copyright (C) 1994-2008 , PUC-Rio显⽰ Lua 版本说明安装正确。

三、运⾏⽅式与其他脚本语⾔⼀样,我们需要将 Lua 代码编写在⽂件中,后缀名为 .lua。

运⾏该⽂件的代码时,只需在命令⾏键⼊ lua xx.lua 即可。

四、语法4.1 数据类型Lua 中包含 8 种基本数据类型,即:nil、boolean、number、string、userdata、function、thread 和 table。

初步LUA语言学习教程

初步LUA语言学习教程

初步LUA语言学习教程LUA是一种轻量级的脚本编程语言,最初是为游戏开发而设计的。

它具有简单易学、可嵌入、高效性和可扩展性的特点,因此在各种领域都有广泛的应用,包括游戏开发、网页编程、嵌入式系统等。

本教程旨在帮助初学者快速入门LUA语言的基本语法和常用功能。

以下是一个简单的LUA程序的例子:```lua-- 打印Hello Worldprint("Hello World")```以上代码使用print函数将字符串"Hello World"打印到控制台。

在LUA中,使用双横线(--)表示单行注释。

LUA语言的基本数据类型包括nil、boolean、number、string、table、function和userdata。

下面是一些常见类型的示例:```lua-- nil类型local a = nil-- boolean类型local b = true-- number类型local c = 123-- string类型local d = "hello"-- table类型local e = {1, 2, 3}-- function类型local f = functionprint("This is a function")end-- userdata类型local g = io.open("file.txt", "r")```在LUA中,变量的定义使用关键字local。

LUA的变量是动态类型的,可以在需要时进行类型的切换。

LUA中的流程控制语句包括if语句、for循环、while循环和repeat...until循环。

下面是一个if语句和for循环的例子:```lua-- if语句local num = 10if num > 0 thenprint("num is positive")elseif num < 0 thenprint("num is negative")elseprint("num is zero")end-- for循环for i = 1, 5 doprint(i)end```在LUA中,数组和字典都可以用table来表示。

Lua脚本语言简明入门教程

Lua脚本语言简明入门教程

Lua脚本语⾔简明⼊门教程这⼏天系统地学习了⼀下Lua这个脚本语⾔,Lua脚本是⼀个很轻量级的脚本,也是号称性能最⾼的脚本,⽤在很多需要性能的地⽅,⽐如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),⽽且能和C语⾔⾮常好的互动。

我很好奇得浏览了⼀下Lua解释器的源码,这可能是我看过最⼲净的C的源码了。

我不想写⼀篇⼤⽽全的语⾔⼿册,⼀⽅⾯是因为已经有了(见本⽂后⾯的链接),重要的原因是,因为⼤篇幅的⽂章会挫败⼈的学习热情,我始终觉得好的⽂章读起来就像拉⼤便⼀样,能⼀⼝⽓很流畅地搞完,才会让⼈爽(这也是我为什么不想写书的原因)。

所以,这必然⼜是⼀篇“⼊厕⽂章”,还是那句话,我希望本⽂能够让⼤家利⽤上下班,上厕所⼤便的时间学习⼀个技术。

呵呵。

相信你现在已经在厕所⾥脱掉裤⼦露出屁股已经准备好⼤便了,那就让我们畅快地排泄吧……运⾏⾸先,我们需要知道,Lua是类C的,所以,他是⼤⼩写字符敏感的。

下⾯是Lua的Hello World。

注意:Lua脚本的语句的分号是可选的,这个和GO语⾔很类似。

复制代码代码如下:print("Hello World")你可以像python⼀样,在命令⾏上运⾏lua命令后进⼊lua的shell中执⾏语句。

复制代码代码如下:chenhao-air:lua chenhao$ luaLua 5.2.2 Copyright (C) 1994-2013 , PUC-Rio> print("Hello, World")Hello, World>也可以把脚本存成⼀个⽂件,⽤如下命令⾏来运⾏。

复制代码代码如下:>lua file.lua或是像shell⼀样运⾏:复制代码代码如下:chenhao-air:lua chenhao$ cat hello.lua#!/usr/local/bin/luaprint("Hello, World")chenhao-air:lua chenhao$ chmod +x hello.luachenhao-air:test chenhao$ ./hello.luaHello, World语法注释复制代码代码如下:-- 两个减号是⾏注释--[[这是块注释这是块注释--]]变量Lua的数字只有double型,64bits,你不必担⼼Lua处理浮点数会慢(除⾮⼤于100,000,000,000,000),或是会有精度问题。

lua基础教程

lua基础教程

lua基础教程最近在看lua,觉得很有趣,发现没有最新版本的例⼦,所以⾃⼰就别⼈的博客⾥弄了源码,然后改成最新版本的lua C API.关于lua⾮常基础的就不介绍了,咱们就从简单的测试开始吧。

1.C/C++执⾏lua脚本我只是⽤改⽤了最新的lua的C API。

不多说,直接上代码#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;int main(){lua_State *pLuaState = luaL_newstate();/*载⼊lua基本库*/luaL_openlibs(pLuaState);//luaopen_base(pLuaState);//luaopen_io(pLuaState); //替换⽼版本的lua_iolibopen(pLuaState);//luaopen_string(pLuaState); //替换⽼版本的lua_strlibopen(pLuaState);//luaopen_math(pLuaState); //替换⽼版本的lua_mathlibopen(pLuaState);//luaopen_debug(pLuaState); //替换⽼版本的lua_dblibopen(pLuaState);/*运⾏脚本*/luaL_dofile(pLuaState,"./script/hw.lua");/*清除lua*/lua_close(pLuaState);/*暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}hw.lua的源码:print("Hello Word!");这个例⼦只是简单的执⾏了⼀个lua脚本。

lua简单入门

lua简单入门

lua简单⼊门⼀、安装windows下的lua环境,luaforwindows下载最新的5.3版本,下载地址:也可以在gitlab下载:下载解压lua53.exe就是lua语⾔解释器按住shift⿏标右键,此处打开命令窗⼝编写⼀个简单的hello world程序test.lua如果觉得简单,可以给⼀个for循环,打印1~10正常执⾏,说明lua环境安装没有问题⼆.lua语⾔的基本语法1. lua的值和类型数值:1,2,31.2 3.14字符类型"hello world"Table类型--lua的table,不需要预定义长度,保证数组在⾸次赋值的时候在最⼤索引加1--没有类型限制--下标从1开始,⾃动扩容--table = 数组+映射--第⼀种写法a={}a[1]=10a[2]=20a[3]="hello"print(a[1],a[2],a[3])a={10,20,"hello"}print(a[1],a[2],a[3])-- 映射的另外写法a = {}a["hello"]=2a[3]=falseprint(a.hello, a[3])--别的写法a={["hello"]=2,[3]=false,}print(a.hello,a[3])1. lua的函数-- 加法函数function add(a,b)return a+b end--调⽤函数print(add(1,2))--调⽤函数不同的写法function add(a,b)return a+b enda = add(1,2)print(a)add = function(a,b)return a+bendfoo =addprint(foo(1,2))--函数返回多个值,返回加法和减法function add(a,b)return a+b,a-bendprint(add(1,2))1. lua中多变量的赋值a,b = 1,2print(a,b)--交换变量a,b = b,a-- 默认值为nila,b = 1-- 多余的值会忽略a,b = 1,2,31. lua的表达式a= 1 + 1print(a)a=1b=2print((b+2)*3)c = 1c = c + 1print(c)5. lua的逻辑表达式--and 两个都为true,返回true,否则返回false--or 任意⼀个为true,返回true--not 取反print(true and false)6. lua拼接字符串,使⽤两个点号 ..print("hello".." world")7. --lua变量的范围-- 全局变量function foo()a = 1 -- 全局变量endfoo()print(a) -- 为1-- 局部变量⼀般使⽤local关键字修饰,我们在lua开发中应该尽量使⽤local局部变量function foo()local a = 1 -- 局部变量,local为作⽤域控制关键词,分隔开,利于阅读,还有优化作⽤endfoo()print(a) -- 为nil8. lua的流程控制,判断和循环-- ⽼段⼦:⽼婆,包⼦和西⽠-- ⽼婆打电话给程序员⽼公打了个电话:下班顺路买⼀⽄包⼦回来,如果看到卖西⽠的就买⼀个-- 当天晚上回来程序员带回来⼀个包⼦,⽼婆怒道:你怎么就买了⼀个包⼦,程序员:因为我看到了卖西⽠的啊-- 当看到卖西⽠的就买⼀个包⼦,没有看到卖西⽠的就买1公⽄包⼦if foundWatermelon() thenbuy("baozi","1")elsebuy("baozi","1kg")enda.while循环,循环打印0-9local i = 0while i < 10 doprint(i)i = i + 1end--lua的for数值遍历--for (int i = 0;i < 10; i ++)--{-- printf("%d\n",i);--}--打印1到10for i = 1,10 doprint(i)end--等价于for i = 1,10,1 doprint(i)end-- 倒叙打印for i = 10,1,-1 doprint(i)endb. lua的for泛型遍历for的泛型遍历: pairs() ipairs() 迭代器-- pairs是内部的函数,功能就是可以把⼀个table⾥⾯的所有部分全部遍历a= {["foo"]=1,[100]=true,[1]=20,[2]=30,}for k,v in pairs(a) doprint(k,v)end-- ipairs 功能变化了,只遍历数组部分a= {["foo"]=1,[100]=true,[1]=20,[2]=30,}for k,v in ipairs(a) doprint(k,v)end三、lua的包管理-- lua的包(package)local c = require("foo") -- 作为⽂件名搜索,默认搜索当前⽬录print(c)print(c.foo(1,2))-- foo.lua 的代码local class={}function class.foo(a,b)return a + bend-- 另外的写法,class的映射:class.foo,foo键的值为⼀个函数--class.foo = function (a,b)-- return a + b--end-- lua的⼀个特点,可以把全局代码当做⼀个值返回return class-- 美化后local socket = require("foo") -- 作为⽂件名搜索,默认搜索当前⽬录print(socket)print(socket.send(1,2))-- fooo.lualocal class={}function class.send(a,b)return a + bend-- 另外的写法,class的映射:class.foo,foo键的值为⼀个函数--class.foo = function (a,b)-- return a + b--end-- lua的⼀个特点,可以把全局代码当做⼀个值返回return class-- require 加载⽂件,运⾏,推荐使⽤-- dofile --加载并运⾏,可以多次加载,⽼的写法-- lua从5.3 以后没有dostring功能了print("require")for i = 1,2 doprint(require("foo"))endfor i = 1,2 doprint(dofile("foo.lua"))end-- 运⾏结果E:\software\lua5.3>lua53.exe test.lua requiretable: 008182a8 -- table相同,表⽰同⼀个table: 008182a8dofiletable: 00817c68table: 0081e350lua的系统库-- 批量插⼊table键值local t = {}for i = 1,10 dotable.insert(t,i)endfor k,v in pairs(t) doprint(k, v)endprint(t)-- 删除数组中的元素table.remove(t,2)-- 循环打印table 结果:for k,v in pairs(table) doprint(k, v)endE:\software\lua5.3>lua53.exe test.luamove function: 69e96240sort function: 69e96ee0insert function: 69e96720remove function: 69e96550concat function: 69e96890unpack function: 69e95e30pack function: 69e95fa0--删除元素的另外写法local t = {}t.a = 1t.b = 2-- 删除⼀个值t.a = nilfor k,v in pairs(t) doprint(k, v)end获取lua中对象的长度-- # 可以获取对象的长度,对象⼀般指的就是字符串和tablelocal t = {5, 1 ,3 ,4, 12}local s = "hello world"-- 得到table的长度print(#t)-- 取字符串的长度print(#s)-- type获取类型print(type(s))-- 字符转换为数字local a = tonumber("3.14")-- 数字转换为数字local b = tostring(3.14)print(b, type(b))-- string.format 把⼀个字符串按照格式构造出来print(string.format("hi %d", 20))总结:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数
• 面向对象方式调用函数的语法
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)
相关文档
最新文档