lua经典学习教程
- 格式:pdf
- 大小:187.85 KB
- 文档页数:11
Lua教程(九):元表与元⽅法详解Lua中提供的元表是⽤于帮助Lua数据变量完成某些⾮预定义功能的个性化⾏为,如两个table的相加。
假设a和b都是table,通过元表可以定义如何计算表达式a+b。
当Lua试图将两个table相加时,它会先检查两者之⼀是否有元表,然后检查该元表中是否存在__add字段,如果有,就调⽤该字段对应的值。
这个值就是所谓的“元⽅法”,这个函数⽤于计算table的和。
Lua中每个值都有⼀个元表。
table和userdata可以有各⾃独⽴的元表,⽽其它数据类型的值则共享其类型所属的单⼀元表。
缺省情况下,table在创建时没有元表,如:复制代码代码如下:t = {}print(getmetatable(t)) --输出为nil这⾥我们可以使⽤setmetatable函数来设置或修改任何table的元表。
复制代码代码如下:t1 = {}setmetatable(t,t1)assert(getmetatable(t) == t1)任何table都可以作为任何值的元表,⽽⼀组相关的table也可以共享⼀个通⽤的元表,此元表将描述了它们共同的⾏为。
⼀个table甚⾄可以作为它⾃⼰的元表,⽤于描述其特有的⾏为。
在Lua代码中,只能设置table的元表,若要设置其它类型值的元表,则必须通过C代码来完成。
1. 算术类的元⽅法:在下⾯的⽰例代码中,将⽤table来表⽰集合,并且有⼀些函数⽤来计算集合的并集和交集等。
复制代码代码如下:Set = {}local metatable = {} --元表--根据参数列表中的值创建⼀个新的集合function Set.new(l)local set = {}--将所有由该⽅法创建的集合的元表都指定到metatablesetmetatable(set,metatable)for _, v in ipairs(l) doset[v] = trueendreturn setend--取两个集合并集的函数function Set.union(a,b)local res = Set.new{}for k in pairs(a) dores[k] = trueendfor k in pairs(b) dores[k] = trueendreturn resend--取两个集合交集的函数function Set.intersection(a,b)local res = Set.new{}for k in pairs(a) dores[k] = b[k]endreturn resendfunction Set.tostring(set)local l = {}for e in pairs(set) dol[#l + 1] = eendreturn "{" .. table.concat(l,", ") .. "}";endfunction Set.print(s)print(Set.tostring(s))end--最后将元⽅法加⼊到元表中,这样当两个由Set.new⽅法创建出来的集合进⾏--加运算时,将被重定向到Set.union⽅法,乘法运算将被重定向到Set.intersectionmetatable.__add = Set.unionmetatable.__mul = Set.intersection--下⾯为测试代码s1 = Set.new{10,20,30,50}s2 = Set.new{30,1}s3 = s1 + s2Set.print(s3)Set.print(s3 * s1)--输出结果为:--{1, 30, 10, 50, 20}--{30, 10, 50, 20}在元表中,每种算术操作符都有对应的字段名,除了上述的__add(加法)和__mul(乘法)外,还有__sub(减法)、__div(除法)、__unm(相反数)、__mod(取模)和__pow(乘幂)。
Lua教程(⼗四):字符串库详解1. 基础字符串函数:字符串库中有⼀些函数⾮常简单,如:1). string.len(s) 返回字符串s的长度;2). string.rep(s,n) 返回字符串s重复n次的结果;3). string.lower(s) 返回s的副本,其中所有的⼤写都被转换为了⼩写形式,其他字符不变;4). string.upper(s) 和lower相反,将⼩写转换为⼤写;5). string.sub(s,i,j) 提取字符串s的第i个到第j个字符。
Lua中,第⼀个字符的索引值为1,最后⼀个为-1,以此类推,如: print(string.sub("[hello world]",2,-2)) --输出hello world6). string.format(s,...) 返回格式化后的字符串,其格式化规则等同于C语⾔中printf函数,如:print(string.format("pi = %.4f",math.pi)) --输出pi = 3.14167). string.char(...) 参数为0到多个整数,并将每个整数转换为对应的字符。
然后返回⼀个由这些字符连接⽽成的字符串,如:print(string.char(97,98,99)) --输出abc8). string.byte(s,i) 返回字符串s的第i个字符的Ascii值,如果没有第⼆个参数,缺省返回第⼀个字符的Ascii值。
复制代码代码如下:print(string.byte("abc")) --输出97print(string.byte("abc",-1)) --输出99由于字符串类型的变量都是不可变类型的变量,因此在所有和string相关的函数中,都⽆法改变参数中的字符串值,⽽是⽣成⼀个新值返回。
2. 模式匹配函数:Lua的字符串库提供了⼀组强⼤的模式匹配函数,如find、match、gsub和gmatch。
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。
--大家好我是hypercross。
--从这个文件开始讲解DIY接口的用法。
--首先,这个文件说明DIY需要的文件及其结构。
--DIY是以module的形式存在的。
每个Module即是一个UTF8格式的Lua文件(建议用notepad++编辑),包含如下格式的代码:module("extensions.moligaloo", package.seeall)-- 进入module。
这里moligaloo这个词必须和文件名相同。
extension = sgs.Package("moligaloo")-- 创建扩展包对象。
变量名必须为extension。
参数名为扩展包的objectName,也是通常会使用的扩展包标识shiqian = sgs.General(extension, "shiqian", "qun")-- 创建武将对象,这里我们的武将是时迁。
关于武将属性的详细说明见reference文档。
shentou = sgs.CreateViewAsSkill{--创建技能,技能种类为ViewAsSkill。
这里的技能是“出牌阶段,你可以将任意一张梅花手牌当作顺手牵羊使用。
”name = "shentou",n = 1,view_filter = function(self, selected, to_select)return to_select:getSuit() == sgs.Card_Club and not to_select:isEquipped() end,view_as = function(self, cards)if #cards == 1 thenlocal card = cards[1]local new_card =sgs.Sanguosha:cloneCard("snatch", card:getSuit(), card:getNumber())new_card:addSubcard(card:getId())new_card:setSkillName(self:objectName())return new_cardendend}--关于技能的说明将是几乎所有其他帮助文件的重点。
Lua教程(⼀):在C++中嵌⼊Lua脚本本系列教程主要介绍如何在C/C++程序⾥⾯嵌⼊Lua脚本,我打算从以下⼏个⽅⾯来介绍:1.如何在C/C++⾥⾯嵌⼊Lua脚本2.Lua访问C/C++数据结构(这⾥⾯要介绍类,结构体,函数,变量,枚举等数据类型在lua⾥⾯如何访问)3.C/C++访问Lua的数据,主要是基本数据类型,函数和Table4.Cocos2D-X⾥⾯的Lua绑定(含⾃动绑定与⼿动绑定)5.Cocos2D-x⾥⾯Lua和C/C++相互调⽤6.Cocos2D-x⾥⾯Lua和Java相互调⽤7.Cocos2D-x⾥⾯Lua和Objective-C相互调⽤本系列教程不会过多地介绍Lua的基本语法,关于Lua基本语法的学习,推荐《Programming In Lua》。
如有纰漏,欢迎指出,谢谢。
另外,关于更新时间,每周⼀篇,定期或者不定期,呵呵。
Mac项⽬集成Lua准备⼯作⾸先,新建⼀个控制台应⽤程序。
打开Xcode,New->Project->OSX->Command Line Tool,取名为Lesson01如下图所⽰:接下来,我们需要下载lua5.2.3.下载完后,解压缩,然后cd到刚刚解压缩的路径下⾯,输⼊make macosx,这样便可以⽣成Mac下⾯的lib⽂件。
接下来把刚刚解压缩的⽂件夹拷贝到你新建的⼯程下⾯,然后设置include路径和library路径。
(注意,这⾥是不需要把头⽂件添加到Xcode⾥⾯的,只要指定include路径,编译的时候,编译器会⾃动去找的。
)因为我的Lua⽂件夹的路径是:xxxx/Lesson01/lua-5.2.3,所以,我把search path和library path分别设置为:复制代码代码如下://search path$(SRCROOT)/Lesson01/lua-5.2.3/src///library path$(PROJECT_DIR)/Lesson01下⾯是我的⼯程与lua之间的⽬录结构,liblua.a⽂件是从src⾥⾯拷贝出来的。
lua语言零基础教程Lua语言零基础教程:Lua是一种功能强大的脚本编程语言,主要用于扩展和嵌入其他应用程序中。
它具有简单易学、轻量级的特点,常被用于游戏开发、网络编程以及嵌入式设备上。
1. 安装Lua:首先,你需要下载并安装Lua解释器。
你可以在Lua官方网站上找到适合你操作系统的安装程序。
安装完成后,你可以在命令行中运行"lua"命令来启动Lua解释器。
2. 基本语法:Lua的语法非常简洁和易懂。
以下是一些基本的语法规则:- 注释:使用"--"来添加单行注释。
例如:-- 这是一个注释。
- 变量:Lua中的变量是全局的,并且无需事先声明类型。
你可以直接对变量赋值。
例如:x = 10。
- 数据类型:Lua支持多种数据类型,包括数字、字符串、布尔值、表、函数等。
例如:x = 10;str = "Hello World";flag = true。
- 循环和条件语句:Lua中的循环和条件语句与其他编程语言类似。
你可以使用"if"语句来进行条件判断,使用"for"和"while"语句来进行循环操作。
- 函数:Lua中的函数定义使用关键字"function",你可以定义自己的函数,并在程序中进行调用。
3. 基本操作:Lua提供了一些基本的操作符,包括算术运算符、比较运算符和逻辑运算符等。
你可以使用这些操作符对变量进行计算和比较。
4. 表(Table):Lua中的表相当于其他编程语言中的数组或字典。
你可以使用表来存储和操作数据。
表可以包含多个键值对,可以根据键来获取对应的值。
5. 文件操作:Lua提供了一些函数用于文件的读写操作。
你可以使用这些函数来读取文件内容、写入文件或者对文件进行其他操作。
这只是Lua语言的一些基础知识,希望能对你入门Lua编程有所帮助。
如果你对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。
MoonScript官方文档–LUA教程MoonScript官方文档我本人写的中文版的MoonScript文档,直接看官方文档其实,还是会不得要领。
后面的英文部分,就是官方的,前面是中文自己写的。
国内用MoonScript的用户相对比较少,作者leafo创作了moonscript,另外还用moonscript创作的一个lua web框架:lapis。
估计moonscript想在国内普及还需要一段路要走。
Coffescript是一种中间的脚本,可以把这种脚本翻译成JavaScript。
而MoonScript,是可以翻译成lua语言的中间脚本。
本文简单的介绍的:1.如何在VIM中,实现MoonScript语法高亮。
2.如何简单的编译MoonScript脚本。
1.安装MoonScriptsudo luarocks install moonscript2.创建.moon源文件 # app.moonlapis = require "lapis"class extends lapis.Application"/": =>"Welcome to Lapis #{require "lapis.version"}!"3.安装MoonScript语法高亮的插件。
# **3-1.下载vim的bundle插件管理程序。
git clone VundleVim/Vundle.vim ~/.vim/bundle/vundle3-2.创建.vimrc配置文件。
vim ~/.vimrc3-3. 编辑.vimrc文件内容。
set nocompatible filetype off set rtp+=~/.vim/bundle/vundle/call vundle#rc() Bundle 'leafo/moonscript-vim' syntax enable3-4.进入VIM,安装bundle插件。