LUA简明教程

合集下载

赢在路上[Cocos2dx]Lua基础入门教程

赢在路上[Cocos2dx]Lua基础入门教程

赢在路上创客学院赢在路上[Cocos2dx]Lua基础入门教程什么是LuaLua 是一个小巧的脚本语言。

是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、WaldemarCeles 和Luiz Henrique de Figueiredo所组成并于1993年开发。

其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。

Lua并没有提供强大的库,这是由它的定位决定的。

所以Lua 不适合作为开发独立应用程序的语言。

Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。

Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。

不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。

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

一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。

这一切都决定了Lua是作为嵌入式脚本的最佳选择Lua里的注释单行注释使用两个减号表示注释的开始,一直延续到行末位置。

相当于C语言中的"//"。

多行注释使用"--[["表示注释开始,使用"]]"表示注释结束。

这种注释相当于C语言中的"/*"和"*/"。

Lua里的运算符算数运算符比较运算符逻辑运算符 在使用逻辑运算符时与C 语言差别很大。

在Lua 语言里,只有false 和nil 才为false ,其他任何数据都是true ,0也是true !!!and 和 or 的运算结果不是true 和false ,而是和他的两个操作数相关。

LUA 脚本语言0基础教程

LUA 脚本语言0基础教程

“red”是自己取名字的哪怕你取成 hongse 也没问题,这句话,已经创建了一个红色值为 255 的颜色对象。 接下来我们吧我们需要的文字打印到屏幕上! screen:print(230,135,"hello world",red) 在 x,y 用我们刚刚创建的颜色对象打印 hello world 的字样! 其实到这里,这个程序已经达到我们的目的了,但是这只有 2 个语句,一瞬间程序就已经 结束了,我们根本来不及看到效果, 那我们就做一个死循环,让他停柱 1 while true do 2 screen.flip() 3 screen.waitVblankStart() 4 end 看第一句,这是一个循环。 ture(真) 所以第一句可翻译成 要是 真就执行 。慢慢理解 来吧~~~ - - 不理解也没关系,往下看 然后第二句 :稍微介绍一下吧。Luaplayer for psp 采用了一种二级缓存的技术,所有的 图形在屏幕下方绘制好,必须要调用 screen.flip()才能吧滴二层屏幕的图形显示给我们看。 第三句:screen.flip()后面更上就对,不然效果就~~~~~(你自己去试试?) 第四句:end 没有什么太特殊的意义, 表示 while 循环体结束,不过注意了 这里它不会 去执行第 5 句,它会跳回第一句执行,因为是循环嘛^_^ 行啦 看看效果,颜色值你可以自己修改,要什么颜色就看你怎么改了,内容也可以改。你 改 "i kill you!" 也行的^_^ 要是你能看见如下效果,那说明两个事, 1.你的开发环境设置好了, 2.这节课你听懂了。 下课~~~~~ - -||
以后就会跳出整个 if 结构外执行,if else 语句,会在表达式计算为假以后,计算 else 后面 的语句,在跳出整个 if。 所以呢。本题的输出结果应该是 20!!! if else 语句的嵌套 例题 3: a = 10 if a > 10 then a=0 elseif a ~= 1 a = 20 end print(a) 解释,if else 的嵌套,其实就是在 if 结构里,在加上一个或者多个 if 语句,本人才疏学浅 - -|不太能解释清楚这个问题。还希望朋友们多多揣摩。 本例题。首先计算 a >10 结果为假于是跳转到 else~~elseif 在计算 a~=1(如果 a 不等 于 1)计算为真,于是执行了 a=20,所以输出结果是~20 下面我们接着讲循环结构语句 for 语句 for 语句的形式 for 变量=起始值,终止值 do 语句 1 语句 2 ……

Lua语言精简教程

Lua语言精简教程


连接运算符
.. 连接符 字符串连接,如果操作数为数字,Lua将数字转成字符串 “hello” .. “world” .. 1பைடு நூலகம்435 ----> “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
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真 控制变量var(上例的a, k, v)是局部变量,自动被声明,并且只在循环内有效. Lua语法要求break和return只能出现在代码块(block)的结尾一句,可以用do..end来绕过

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中的table不是⼀种简单的数据结构,它可以作为其它数据结构的基础。

如数组、记录、线性表、队列和集合等,在Lua中都可以通过table来表⽰。

1. 数组:使⽤整数来索引table即可在Lua中实现数组。

因此,Lua中的数组没有固定的⼤⼩,如:复制代码代码如下:a = {}for i = 1, 1000 doa[i] = 0endprint("The length of array 'a' is " .. #a)--The length of array 'a' is 1000在Lua中,可以让任何数作为数组的起始索引,但通常⽽⾔,都会使⽤1作为其起始索引值。

⽽且很多Lua的内置功能和函数都依赖这⼀特征,因此在没有充分理由的前提下,尽量保证这⼀规则。

下⾯的⽅法是通过table的构造器来创建并初始化⼀个数组的,如:复制代码代码如下:squares = {1, 4, 9, 16, 25}2. ⼆维数组:在Lua中我们可以通过两种⽅式来利⽤table构造多维数组。

其中,第⼀种⽅式通过“数组的数组”的⽅式来实现多维数组的,即在⼀维数组上的每个元素也同样为table对象,如:复制代码代码如下:mt = {}for i = 1, N domt[i] = {}for j = 1, M domt[i][j] = i * jendend第⼆种⽅式是将⼆维数组的索引展开,并以固定的常量作为第⼆维度的步长,如:复制代码代码如下:mt = {}for i = 1, N dofor j = 1, M domt[(i - 1) * M + j] = i * jendend3. 链表:由于table是动态的实体,所以在Lua中实现链表是很⽅便的。

其中,每个结点均以table来表⽰,⼀个“链接”只是结点中的⼀个字段,该字段包含对其它table的引⽤,如:复制代码代码如下:list = nilfor i = 1, 10 dolist = { next = list, value = i}local l = listwhile l doprint(l.value)l = l.nextend4. 队列与双向队列:在Lua中实现队列的简单⽅法是使⽤table库函数insert和remove。

Lua教程第三课

Lua教程第三课
a,_,b=testmycode([[print("你好世界")]],"我的世界",1,5,36,2)--[[这双中括号中的东西直接当作文本不会被程序误解哦!]],赋值的时候不打算接受的东西可以用_代替变量的位置
print(table.concat(b))--table.concat()函数会自动把你提供的数组里的内存合并并返回,很实用的样子..
function 函数名 (小参数)
各种命令...
可以return一些东西哦
end 这个便是格式,其实Lua可以不用回车的,直接空格就好了,不过这样比较好看
真正的例子:
function testmycode (code,myname,...)--三点以为这可变参数,可能不止一个,可能一堆
下面就是迭代了,不过我迭代不是很懂....,函数先讲到这里吧...额.....
-----好,【莫名其妙的教程】菜鸟的Lua入门第三课结束了!-----额..莫名其妙的结束了------
效果出来了..你好世界,我的世界,15362,貌似网站的那个lua执行器不支持loadstring...我用本地的lua解释器完成的
end
好函数格式介绍好了,额
此时要解释一下我说的函数在Lua中貌似就是一种值,列,函数名={},函数地址={}
function 函数.... 则,table.insert(函数名,"函数"),table.insert(函数地址,刚才的函数地址)
end
--if ..........---伪命令,检测其他的参数
local b--因为loadstring会返回一个函数,用这个b装载并执行
b=loadstring(code)--loadstring()意味着载入命令但不执行,返回一个函数给你,载入的东西要是文本型的哦,不过loadstring是很危险的东西..

Lua简易ppt教程

Lua简易ppt教程


活用表类型,可以构成结构体、链表、数组、对象等各种复杂数据结 构。
函数

因为函数是Lua的普通类型,所以不具有名称,要想使用 名称来调用函数,必须将函数本身赋值给一个变量:
r2p = function(x, y) abs = math.sqrt((x * x) + (y * y)) arg = math.atan2(x, y) return abs, arg end
走近Lua
——嵌入式脚本在项目中的应用
什么是Lua

Lua是一种脚本编程语言,于1994年,由巴西里约热内卢 天主教大学的研究人员设计开发,“Lua”这个名字是葡萄 牙语单词 “月亮”。 与一般脚本语言如 PHP、Perl、JavaScript 等不同,Lua被 称为是一种嵌入式 脚本语言,Lua最著名的应用是在暴雪 公司的网络游戏 魔兽世界 中。
赋值:a = 3 基本类型:
– 空类型 nil – 数值 number – 布尔 boolean – 字符串 string nil 123 true
x, y, z = 12, 'Hello', true
3.14159 false
1.6e-9
运算:+ - * / % ^(乘幂) -(负)
运算:or and not


编译及运行
编译:gcc –o demo1 demo1.c –llua 运行:./demo1 结果输出: Hello, world! Hello, wordl! Hello, world! Hello, world! Hello, world!

可见Lua是一种简便的工具,利用其API,宿主语言极易实 现Lua解析器,这是一般脚本语言无法比拟的。

Lua 语言 15 分钟快速入门

Lua 语言 15 分钟快速入门
-- Lua可以通过通常的方式去访问它的key,例如__add。
-- 不过下面的代码是错误的,因为s没有元表:
-- t = s + s
-- 下面的类形式的模式可以解决这个问题:
-- 元表的__index 可以重载点运算符的查找:
defaultFavs = {animal = 'gru', food = 'donuts'}
else
-- 默认变量都是全局的。
thisIsGlobal = 5 -- 通常用驼峰式定义变量名。
-- 如何定义局部变量:
local line = io.read() -- 读取stdin的下一行。
-- ..操作符用于连接字符串:
print('Winter is coming, ' .. line)
-- 只不过它有连续的整数作为key,可以像list那样去使用。
----------------------------------------------------
-- 3.1 元表(metatable) 和元方法(metamethod)。
----------------------------------------------------
-- table的元表提供了一种机制,可以重定义table的一些操作。
-- 之后我们会看到元表是如何支持类似js的prototype行为。
f1 = {a = 1, b = 2} -- 表示一个分数 ab.
f2 = {a = 2, b = 3}
-- 这个是错误的:
-- s = f1 + f2
karlSum = karlSum + i

CC++程序员的Lua快速入门指南

CC++程序员的Lua快速入门指南

一种简单的对象实现方式*
function create(name, id) local obj = { name = name, id = id } function obj:SetName(name) = name end function obj:GetName() return end function obj:SetId(id) self.id = id end function obj:GetId() return self.id end return obj
简单继承*
function createRobot(name, id) local obj = { name = name, id = id }
function obj:SetName(name) = name
end
function obj:GetName() return
函数闭包
function createCountdownTimer (second)
local ms = second * 1000 local function countDown()
ms = ms - 1 return ms end return countDown end
timer1 = createCountdownTimer(1) for i = 1, 3 do
print(timer1()) end
print("------------") timer2 = createCountdownTimer(1) for i = 1, 3 do
print(timer2()) end
输出结果: 999 998 997 -----------999 998 997

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 5.1 虚拟机指令简明手册

Lua 5.1 虚拟机指令简明手册

A No-Frills Introduction to Lua5.1VM InstructionsLua5.1虚拟机指令简明手册作者Kein-Hong Man,esq.<khman AT >版本0.1,20060313Contents目录1Introduction序言22Lua Instruction Basics Lua指令基础33Really Simple Chunks十分简单的程序块54Lua Binary Chunks Lua二进制程序快75Instruction Notation指令记法156Loading Constants加载常量167Upvalues and Globals Upvalue和全局变量208Table Instructions表指令229Arithmetic and String Instructions算术和字符串指令2310Jumps and Calls跳转和调用2811Relational and Logic Instructions关系和逻辑指令3512Loop Instructions循环指令4213Table Creation表创建4814Closures and Closing创建和结束闭包5215Comparing Lua5.0.2and Lua5.1比较Lua5.0.2和Lua5.15616Digging Deeper深入探究5717Acknowledgements致谢5718ChangeLog&ToDos变更纪录&待做的57“A No-Frills Introduction to Lua 5.1VM Instructions”is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License 2.0.You are free to copy, distribute and display the work,and make derivative works as long as you give the original author credit,you do not use this work for commercial purposes,and if you alter,transform, or build upon this work,you distribute the resulting work only under a license identical to-1-this one.See the following URLs for more information:“Lua5.1虚拟机指令简明手册”遵循Creative Commons Attribution-NonCommercial-ShareAlike许可2.0。

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))总结:。

lua脚本入门

lua脚本入门

lua脚本⼊门在⽹上下载⼀些⼯程,⾥边常常存在.lua .sh .in .cmake .bat等⽂件今天专门查了⼀下相关⽂件的作⽤.sh 通常是linux、unix系统下的脚本⽂件(⽂本⽂件),⽤于调⽤默认的shell,执⾏⼀些操作系统命令,理解的是类似windows下的dos命令。

.in 是对⽂件进⾏统⼀的管理。

check out是将⼀个数据库中的⽂件下载到本地,⼀旦⽂件被check out后,其他⼈只允许浏览该⽂件,⽽⽆法修改此⽂件,只有这个⽂件被check in后,其他⼈才可以对此⽂件check out⼯作,来对此⽂件进⾏修改。

.lua 这是我们的重点:lua⽂件是什么? ⼀种⼩巧的脚本语⾔,其设计⽬的是为了嵌⼊应⽤程序中,从⽽为应⽤程序提供灵活的扩展和定制功能。

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

Lua并没有提供强⼤的库,这是由它的定位决定的。

所以Lua不适合作为开发独⽴应⽤程序的语⾔。

Lua 有⼀个同时进⾏的JIT项⽬,提供在特定平台上的即时编译功能。

Lua脚本可以很容易的被C/C++ 代码调⽤,也可以反过来调⽤C/C++的函数,这使得Lua在应⽤程序中可以被⼴泛应⽤。

不仅仅作为扩展脚本,也可以作为普通的配置⽂件,代替XML,ini等⽂件格式,并且更容易理解和维护。

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

⼀个完整的Lua解释器不过200k,在⽬前所有脚本引擎中,Lua的速度是最快的。

这⼀切都决定了Lua是作为嵌⼊式脚本的最佳选择。

运⾏可以通过 Lua 的交互模式,也可以⽤记事本编辑代码保存为 .lua 的格式,通过 lua 编译器运⾏。

也可以通过第三⽅⼯具,将 lua 打包独⽴运⾏。

本地环境搭建在本地搭建 Lua 编程语⾔的开发运⾏环境,你需要在你的计算机上安装如下三个软件:(1) ⽂本编辑器。

(2) Lua 解释器。

Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)(中文#..

Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)(中文#..

热度Lua脚本‎语言入门(目前魔兽使‎用的可以写‎在宏内的语‎言)(中文)作者:沐枫Lua 程序设计初‎步作者:沐枫(第二人生成‎员)版权所有转‎载请注明原‎出处在这篇文章‎中,我想向大家‎介绍如何进‎行Lua程‎序设计。

我假设大家‎都学过至少‎一门编程语‎言,比如Bas‎i c或C,特别是C。

因为Lua‎的最大用途‎是在宿主程‎序中作为脚‎本使用的。

Lua 的语法比较‎简单,学习起来也‎比较省力,但功能却并‎不弱。

在Lua中‎,一切都是变‎量,除了关键字‎。

请记住这句‎话。

I. 首先是注释‎写一个程序‎,总是少不了‎注释的。

在Lua中‎,你可以使用‎单行注释和‎多行注释。

单行注释中‎,连续两个减‎号"--"表示注释的‎开始,一直延续到‎行末为止。

相当于C++语言中的"//"。

多行注释中‎,由"--[["表示注释开‎始,并且一直延‎续到"]]"为止。

这种注释相‎当于C语言‎中的"/*…*/"。

在注释当中‎,"[["和"]]"是可以嵌套‎的。

II. Lua编程‎经典的"Hello‎world‎"的程序总是‎被用来开始‎介绍一种语‎言。

在Lua中‎,写一个这样‎的程序很简‎单:print‎("Hello‎world‎")在Lua中‎,语句之间可‎以用分号";"隔开,也可以用空‎白隔开。

一般来说,如果多个语‎句写在同一‎行的话,建议总是用‎分号隔开。

Lua 有好几种程‎序控制语句‎,如:条件控制:if 条件then … elsei‎f条件then … else … endWhile‎循环:while‎条件do … endRepea‎t循环:repea‎t … until‎条件For循环‎:for 变量= 初值,终点值,步进do … endFor循环‎:for 变量1,变量2,… ,变量N in表或枚‎举函数do … end注意一下,for的循‎环变量总是‎只作用于f‎o r的局部‎变量,你也可以省‎略步进值,这时候,for循环‎会使用1作‎为步进值。

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

Lua 简明教程
2013-12-313:45|发布者:红黑魂|查看:2591|评论:0|原作者:陈皓|来自:酷壳网
摘要:这几天系统地学习了一下Lua 这个脚本语言,Lua 脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark 的脚本,当你把他的源码下下来编译后,你会发现解释器居...
这几天系统地学习了一下Lua 这个脚本语言,Lua 脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx ,wireshark 的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k ,这是多么地变态啊(/bin/sh 都要1M ,MacOS 平台),而且能和C 语言非常好的互动。

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

我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文章会挫败人的学习热情,我始终觉得好的文章读起来就像拉大便一样,能一口气很流畅地搞完,才会让人爽(这也是我为什么不想写书的原因)。

所以,这必然又是一篇“入厕文章”
,还是那句话,我希望本文能够让大家利用上下班,上厕所大便的时间学习一个技术。

呵呵。

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

下面是Lua 的Hello World 。

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

你可以像python 一样,在命令行上运行lua 命令后进入lua 的shell 中执行语句。

也可以把脚本存成一个文件,用如下命令行来运行。

或是像shell 一样运行:
6
语法
变量
Lua 的数字只有double 型,64bits ,你不必担心Lua 处理浮点数会慢(除非大于100,000,000,000,000),或是会有精度问题。

你可以以如下的方式表示数字,0x 开头的16进制和C 是很像的。

字符串你可以用单引号,也可以用双引号,还支持C 类型的转义,比如:‘\a’(响铃),‘\b’(退格),‘\f’(表单),‘\n’(换行),‘\r’(回车),‘\t’
(横向制表),‘\v’(纵向制表),‘\\’(反斜杠),‘\”‘(双引号),以及‘\”(单引号)
下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)
C 语言中的NULL 在Lua 中是nil ,比如你访问一个没有声明过的变量,就是nil ,比如下面的v 的值就是nil
布尔类型只有nil 和false 是false ,数字0啊,‘’空字符串(’\0′)都是true !
另外,需要注意的是:lua 中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。

变量前加local 关键字的是局部变量。

控制语句
不多说了,直接看代码吧(注意:Lua没有++或是+=这样的操作)
上面的语句不但展示了if-else语句,也展示了
1)“~=”是不等于,而不是!=
2)io库的分别从stdin和stdout读写的read和write函数
3)字符串的拼接操作符“..”
另外,条件表达式中的与或非为分是:and,or,not关键字。

for循环
从1加到100
从1到100的奇数和
从100到1的偶数和
函数
Lua的函数和Javascript的很像
闭包
同样,Javascript附体!
示例一
示例二
和Go语言一样,可以一条语句上赋多个值,如:
上面的代码中,因为只有3个变量,所以第四个值被丢弃。

函数也可以返回多个值:
注意:上面的示例中,因为没有传id ,所以函数中的id 输出为nil ,因为没有返回bGay ,所以bGay 也是nil 。

局部函数
函数前面加上local 就是局部函数,其实,Lua 中的函数和Javascript 中的一个德行。

比如:下面的两个函数是一样的:
Table
所谓Table 其实就是一个Key Value 的数据结构,它很像Javascript 中的Object
,或是PHP 中的数组,在别的语言里叫Dict 或Map ,Table 长成这个样子:
下面是table 的CRUD 操作:
上面看上去像C/C++中的结构体,但是name,age,handsome,website 都是key 。

你还可以像下面这样写义Table :
这样就更像Key Value 了。

于是你可以这样访问:t[20],t["name"],t[3.14]。

我们再来看看数组:
这样看上去就像数组了。

但其实其等价于:
所以,你也可以定义成不同的类型的数组,比如:
注:其中的函数可以这样调用:arr[4]()。

我们可以看到Lua 的下标不是从0开始的,是从1开始的。

注:上面的程序中:#arr 的意思就是arr 的长度。

注:前面说过,Lua 中的变量,如果没有local 关键字,全都是全局变量,Lua 也是用Table 来管理全局变量的,Lua 把这些全局变量放在了一个叫“_G”的Table 里。

我们可以用如下的方式来访问一个全局变量(假设我们这个全局变量名叫globalVar ):
我们可以通过下面的方式来遍历一个Table 。

MetaTable 和MetaMethod
MetaTable 和MetaMethod 是Lua 中的重要的语法,MetaTable
主要是用来做一些类似于C++重载操作符式的功能。

比如,我们有两个分数:
我们想实现分数间的相加:2/3+4/7,我们如果要执行:fraction_a +fraction_b ,会报错的。

所以,我们可以动用MetaTable ,如下所示:
为之前定义的两个table 设置MetaTable :(其中的setmetatble 是库函数)
于是你就可以这样干了:(调用的是fraction_op.__add()函数)
至于__add 这是MetaMethod ,这是Lua 内建约定的,其它的还有如下的MetaMethod :
“面向对象”上面我们看到有__index
这个重载,这个东西主要是重载了find key 的操作。

这操作可以让Lua 变得有点面向对象的感觉,让其有点像Javascript 的prototype 。

(关于Javascrip 的面向对象,你可以参看我之前写的Javascript 的面向对象)
所谓__index ,说得明确一点,如果我们有两个对象a 和b ,我们想让b 作为a 的prototype 只需要:
例如下面的示例:你可以用一个Window_Prototype 的模板加上__index 的MetaMethod 来创建另一个实例:
于是:MyWin 中就可以访问x,y,width,height 的东东了。

有了以上的基础,我们可以来说说所谓的Lua 的面向对象。

上面我们可以看到有一个new方法和一个toString的方法。

其中:
1)self就是Person,Person:new(p),相当于Person.new(self,p)
2)new方法的self.__index=self的意图是怕self被扩展后改写,所以,让其保持原样
3)setmetatable这个函数返回的是第一个参数的值。

于是:我们可以这样调用:
继承如下,我就不多说了,Lua和Javascript很相似,都是在Prototype的实例上改过来改过去的。

11
模块
我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua。

载入的时候就直接执行那个文件了。

比如:
我们有一个hello.lua的文件:
如果我们:require(“hello”),那么就直接输出Hello,World!了。

注意:
1)require函数,载入同样的lua文件时,只有第一次的时候会去执行,后面的相同的都不执行了。

2)如果你要让每一次文件都会执行的话,你可以使用dofile(“hello”)函数
3)如果你要玩载入后不执行,等你需要的时候执行时,你可以使用loadfile()函数,如下所示:
loadfile(“hello”)后,文件并不执行,我们把文件赋给一个变量hello,当hello()时,才真的执行。

(我们多希望JavaScript也有这样的功能(参看《Javascript装载和执行》))
当然,更为标准的玩法如下所示。

假设我们有一个文件叫mymod.lua,内容如下:
文件名:mymod.lua
于是我们可以这样使用:
其实,require干的事就如下:(所以你知道为什么我们的模块文件要写成那样了)
参考
我估计你差不多到擦屁股的时间了,所以,如果你还比较喜欢Lua的话,下面是几个在线文章你可以继续学习之: lua在线手册
lua在线lua学习教程
lua参考手册Lua参考手册的中文翻译(云风翻译版本)
关于Lua的标库,你可以看看官方文档:string,table,math,io,os。

(全文完)。

相关文档
最新文档