C和C++程序员的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 语言 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

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

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

在这篇文章中,我想向大家介绍如何进行Lua程序设计。

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

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

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

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

请记住这句话。

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

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

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

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

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

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

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

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

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

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

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

你可以用break来中止一个循环。

如果你有程序设计的基础,比如你学过Basic,C之类的,你会觉得Lua也不难。

Lua教程(一):在C++中嵌入Lua脚本

Lua教程(一):在C++中嵌入Lua脚本

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 c 语法

lua c 语法

lua c 语法
哎呀,各位看官,今儿个咱就来摆摆龙门阵,说说这lua和c的语法吧。

说起lua,那可是个轻巧灵活的小家伙,就像咱们四川的麻辣火锅,看上去不起眼,一吃下去,那味道,啧啧,真是巴适得板!lua的语法也是这么一回事儿,简单明了,一看就会。

就像咱四川人说话,直来直去,不拐弯抹角。

比如,你要输出个“你好”,lua就这么写:“print('你好')”,就跟咱四川人打招呼一样,直截了当。

再来说说c语言吧,那家伙可就有点儿像个陕西的老汉,稳重厚实,一板一眼。

c语言的语法严谨复杂,就像陕西的面食,看似简单,但里面的讲究可多着呢。

比如,你要定义一个变量,得先指定类型,再给它取个名字,然后才能用。

这就像陕西人做面,得先把面和好,再拉成条,最后才能下锅。

虽然麻烦点儿,但做出来的味道,那可真是一绝!
至于北京方言嘛,那就像lua和c的结合体了。

既有lua的灵活轻巧,又有c的稳重厚实。

就像北京的烤鸭,皮薄肉嫩,外酥里嫩,既有南方的细腻,又有北方的豪放。

北京人说话也是这么回事儿,既有南方的委婉,又有北方的直爽。

所以嘛,北京的程序员写代码,也是既注重效率,又追求美观,真是难得一见的人才啊!
总的来说嘛,lua和c的语法各有千秋,就像咱们各地的方言一样,各有各的特色。

不管你是喜欢用lua的轻巧灵活,还是喜欢c的稳重厚实,只要你能把代码写得既科学又合理,那就都是好样的!就像咱们各地的美食一样,只要好吃,那就是硬道理!。

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和c之间互相调用方式

Lua编程之lua和c之间互相调用方式

Lua编程之lua和c之间互相调用方式Lua编程之Lua和C之间互相调用方式Lua和C调用主要有两种方式:1.在C中运行,C函数调用Lua,Lua要注册C函数库。

2.程序在lua中运行,C注册到lua中。

第一种方式看起来很奇怪。

既然程序主体运行在C中,而且最终使用的也是C中定义的函数,那么为何要将Lua函数注册给Lua,然后再通过Lua 调用函数呢?其实lua库在此调用中只是一个中间库,他只是一个table 保存C库函数的指针,一旦C函数注册到Lua中,Lua就可以直接通过C 函数的引用获取到C函数的地址(这也是我们注册的意义,将C函数的地址提供给Lua)。

也就是说,我们必须把C 函数的地址以一个适当的方式传递给Lua解释器。

而这个指针只是保存在了Lua虚拟栈中。

首先看第二种Lua如何调用C。

lua可以将C函数注册到lua中,C函数必须遵循统一的原型格式,这个原型定义在lua.h中.typedefint (*) (lua_State *)被注册的C函数接收一个单一的lua_State类型的参数,同时返回一个表示返回值个数的数字。

函数在将返回值入栈之前无需清理栈,在函数返回之后,Lua会自动清除栈中返回结果下面的所有内容。

用C函数扩展lua时,一般将所有的C函数编译成一个独立的模块,方便增加新的函数。

//mylib.c#include#include#include#include#include/* 所有注册给Lua的C函数具有* "typedefint(*lua_CFunction) (lua_State *L);"的原型。

*/staticintmyadd(lua_State *L){//如果给定虚拟栈中索引处的元素可以转换为数字,则返回转换后的数字,否则报错。

int a = luaL_checknumber(L, 1);int b = luaL_checknumber(L, 2);/* 这里可以看出,C可以返回给Lua多个结果, *通过多次调用lua_push*(),之后return返回结果的数量。

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),或是会有精度问题。

Unity3D预备知识:C#与Lua相互调用

Unity3D预备知识:C#与Lua相互调用

Unity3D预备知识:C#与Lua相互调⽤ 在使⽤Unity开发游戏以⽀持热更新的⽅案中,使⽤ULua是⽐较成熟的⼀种⽅案。

那么,在使⽤ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了?⼀.基本原理 简单地说,c#调⽤lua,是c# 通过Pinvoke⽅式调⽤了lua的dll(⼀个C库),然后这个dll执⾏了lua脚本。

ULua = Lua + LuaJit(解析器、解释器) +LuaInterface。

其中,LuaInterface中的核⼼就是C#通过Pinvoke对Lua C库调⽤的封装,所以,在Unity中,LuaInterface就是C#与Lua进⾏交互的接⼝。

下⾯我们以⼀个简单的例⼦来演⽰C#与Lua的相互调⽤。

⼆.⼊门例⼦ 如下是构建这个例⼦的步骤。

(1)下载ULua源码。

(2)在Unity中新建⼀个项⽬,并将ULua源码拷贝到Assets⽬录下。

(3)将ulua.dll(就是上⾯提到的C库)放到Assets下的Plugins⽂件夹中。

(没有Plugins⽂件夹就新建⼀个)(4)在Assets下的Script⽂件夹中新建⼀个脚本CSharpLuaTest.cs,并将该脚本绑定到Main Camera上。

(5)在CSharpLuaTest.cs中编辑以下内容:public class CSharpLuaTest : MonoBehaviour {private LuaState luaState = new LuaState(); // 创建lua虚拟机void Start (){// 在lua虚拟机(全局)中注册⾃定义函数this.luaState.RegisterFunction("CSharpMethod", this, this.GetType().GetMethod("CSharpMethod"));// 加载lua⽂件(绝对路径)this.luaState.DoFile(Application.streamingAssetsPath + "/Test.lua");// 加载完⽂件后,使⽤GetFunction获取lua脚本中的函数,再调⽤Call执⾏。

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教程(五):CC++操作Lua数组和字符串示例

Lua教程(五):CC++操作Lua数组和字符串示例

Lua教程(五):CC++操作Lua数组和字符串⽰例本⽂将介绍如何在C/C++⾥⾯操作Lua的数组和字符串类型,同时还会介绍如何在C/C++函数⾥⾯存储Lua状态(registry和upvalue),⽽registry在使⽤C/C++⾃定义类型时⾮常有⽤,可以⽅便地为userdata指定metatable。

C/C++操作Lua数组Lua数组Overview在Lua⾥⾯,数组只不过是key为整数的table⽽已。

⽐如⼀个table为array = {12,”Hello”, “World”},它是⼀个数组,可以⽤下⾯的代码来访问它:复制代码代码如下:print(array[1]) --这⾥会输出array的第⼀个元素12。

print(array[3]) --这⾥会输出array的第三个元素World需要注意的⼀点就是:Lua的数组的下标是从1开始的。

如果你使⽤下⾯的语句则会输出nil值:复制代码代码如下:print(array[0]) --输出nilprint(array["1"]) --输出nil(想想和array[1]的区别:⼀个是integer作为key,⼀个是字符串做为key)通⽤Table操作⽅法之前我们在中介绍了如何传递Table给Lua,以及在中介绍了如何访问Table的数据。

因为数组也是Table,所以我们可以⽤同样的⽅式来读取数组。

读取数组假设我们的Lua Table为array = {“Hello”, 1, “World”, 23.2},那么我们可以⽤下列函数来访问它:复制代码代码如下:void readLuaArray(lua_State *L){lua_settop(L,0); //这样确保我们的array是放在当前栈的栈顶。

lua_getglobal(L, "array");//如果前⾯不调⽤lua_settop(L,0),那我们必须要使⽤luaL_len(L,-1)int n = luaL_len(L, 1); //luaL_len可以获得table的元素个数for (int i = 1; i <= n; ++i) {lua_pushnumber(L, i); //往栈⾥⾯压⼊ilua_gettable(L, -2); //读取table[i],table位于-2的位置。

Lua脚本编写实践指南

Lua脚本编写实践指南

Lua脚本编写实践指南Lua是一种轻量级的脚本语言,广泛应用于各种领域,包括游戏开发、嵌入式系统和Web开发等。

本文将为初学者提供一份Lua脚本编写实践指南,帮助他们快速入门并提高编写Lua脚本的能力。

一、Lua基础在开始编写Lua脚本之前,需要了解一些基本的语法和概念。

1. 变量与类型Lua是一种动态弱类型语言,可以使用关键字"local"定义局部变量。

Lua支持多种基本数据类型,包括nil、boolean、number、string和table等。

2. 控制流Lua提供了常见的控制流语句,比如条件判断语句if-else、循环语句while和for等。

掌握这些语句的使用可以更好地控制程序的流程。

3. 函数与模块函数是Lua中的重要组成部分,可以重用代码并提高程序的可维护性。

除了内置的函数,我们也可以自定义函数,并将一些常见的功能封装成模块,方便复用。

二、Lua脚本编写实践1. 规范命名在编写Lua脚本时,命名是十分重要的。

合理的命名可以增加代码的可读性和可维护性。

通常情况下,我们可以遵循以下几点原则: - 使用有意义的名称,能够准确描述变量或函数的用途;- 使用驼峰命名法或下划线命名法,使命名更加清晰易读;- 避免使用过长或过短的命名,保持命名简洁明了。

2. 注释与文档在Lua脚本中添加适当的注释可以提高代码的可读性和可理解性。

注释应该清晰明了,简述代码的功能和约束等。

此外,我们还可以为脚本添加文档,以便他人更好地理解和使用。

3. 错误处理在编写Lua脚本时,合理的错误处理是必不可少的。

我们应该使用适当的技术手段(如assert函数和错误处理函数)来捕获、处理和记录错误,以确保程序的稳定性和可靠性。

4. 代码复用Lua具有良好的可扩展性和代码复用性。

我们可以将一些常用的功能封装成函数或者模块,以便在不同场景下重复使用。

这样可以减少代码的冗余,提高开发效率。

5. 效率优化在编写Lua脚本时,我们应该关注代码的执行效率。

lua入门概览

lua入门概览

一.Hello World1.前言偶最近在学习Lua, 所以写出心得和大家共享, 争取一天写一篇, 嘿嘿.才开始学所以内容很浅, 希望大家包涵.Lua是一种完全免费的脚本语言, 可以和C/C++语言紧密结合,它的官方网站在. 在网站上可以下载到lua的源码, 没有可执行版本, 不过不用担心, 因为lua源码可以在任何一种C/C++的编译器上编译.如果要学习Lua, 官方网站上的Reference是必备的,上面有每个命令的用法,非常详细。

参考手册/manual/5.0/作者写的Programming in Lua /pil/2.编译如果用的VC6, 可以下载所需的project文件,地址在/project/showfiles.php?group_id=32250&package_id=115604VSNET2003可以下载这个sln文件/~vertigrated/lua/vs7.zip偶用的是cygwin和linux, 打入以下命令即可,tar -zxvf lua-5.0.2.tar.gzcd lua-5.0.2sh ./configuremake这样就OK了。

为了以后使用方便,最好把bin目录加入到path里面。

3."Hello, world!"现在开始偶们的第一个小程序"Hello, world!"把以下程序打入文件e01.lua例1:e01.lua-- Hello World in Luaprint("Hello World.")Lua有两种执行方式,一种是嵌入到C程序中执行,还有一种是直接从命令行方式下执行。

这里为了调试方便,采用第二种方式,执行命令lua e01.lua输出结果应该是:Hello World.4.程序说明第一行-- Hello World in Lua这句是注释,其中--和C++中的//意思是一样的第二行print("Hello World.")调用lua内部命令print,输出"Hello World."字符串到屏幕,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作‎为步进值。

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中调用C语言、C++的函数

Lua教程(四):在Lua中调用C语言、C++的函数

Lua教程(四):在Lua中调⽤C语⾔、C++的函数本教程将介绍如何在Lua⾥⾯调⽤c/c++函数。

在Lua⾥⾯调⽤c/c++函数其实是⽐较简单,本⽂将通过两个⽰例演⽰具体的做法:⼀个是求平均数,另⼀个是打印lua函数的⼀些参数信息。

最后,本⽂会介绍如何把这两个函数定义成⼀个模块,这样lua代码⾥⾯就可以不再使⽤全局的名字空间了。

前⾔当我们需要在Lua⾥⾯调⽤c/c++函数时,所有的函数都必须满⾜以下函数签名:复制代码代码如下:typedef int (*lua_CFunction) (lua_State *L);换句话说,所有的函数必须接收⼀个lua_State作为参数,同时返回⼀个整数值。

因为这个函数使⽤Lua栈作为参数,所以它可以从栈⾥⾯读取任意数量和任意类型的参数。

⽽这个函数的返回值则表⽰函数返回时有多少返回值被压⼊Lua栈。

(因为Lua 的函数是可以返回多个值的)⽰例⼀定义C++函数指针复制代码代码如下:int average(lua_State *L){// get number of argumentsint n = lua_gettop(L);double sum = 0;int i;// loop through each argumentfor (i = 1; i <= n; i++){// total the argumentssum += lua_tonumber(L, i);}// push the averagelua_pushnumber(L, sum / n);// push the sumlua_pushnumber(L, sum);// return the number of resultsreturn 2;}注册此函数给Lua复制代码代码如下:lua_register(L, "average", average);Lua⾥⾯调⽤此函数复制代码代码如下:avg, sum = average(10, 20, 30, 40, 50)print("The average is ", avg)print("The sum is ", sum)⽰例⼆定义C++函数复制代码代码如下:int displayLuaFunction(lua_State *l){// number of input argumentsint argc = lua_gettop(l);// print input argumentsstd::cout << "[C++] Function called from Lua with " << argc<< " input arguments" << std::endl;for(int i=0; i<argc; i++){std::cout << " input argument #" << argc-i << ": "<< lua_tostring(l, lua_gettop(l)) << std::endl;lua_pop(l, 1);}// push to the stack the multiple return valuesstd::cout << "[C++] Returning some values" << std::endl;lua_pushnumber(l, 12);lua_pushstring(l, "See you space cowboy");// number of return valuesreturn 2;}注册此Lua函数复制代码代码如下:// push the C++ function to be called from Luastd::cout << "[C++] Pushing the C++ function" << std::endl;lua_pushcfunction(L, displayLuaFunction);lua_setglobal(L, "displayLuaFunction");注意,上⼀个⽰例,我们使⽤的是函数是复制代码代码如下:lua_register(L, "average", average);它其实只是⼀个宏定义,其实现也是上⾯两个函数组成的。

Linux下Lua开发环境配置及C调用Lua示例

Linux下Lua开发环境配置及C调用Lua示例

2012SergioC & LUA简单讲述如何在Linux下安装Lua开发环境、开发调试Lua程序、在C程序中调用Lua脚本以及使用Lua在windows环境下访问mysql数据库目录第1章关于LUA (2)第2章LINUX下LUA开发环境准备 (3)第3章第一个LUA (5)3.1 HELLOWORLD (5)第4章在C语言中调用LUA (6)4.1 简单调用L UA脚本 (6)4.2 调用L UA函数 (7)第5章WINDOWS环境下访问MYSQL数据库 (8)第6章参考文档 (10)第1章关于Lua问:什么是Lua?答:Lua 是一个小巧的脚本语言。

是巴西里约热内卢天主教大学里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和Luiz Henrique de Figueiredo 所组成并于1993年开发。

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

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

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

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

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

成功应用:魔兽世界、博德之门、愤怒的小鸟等。

发音:/'lua/(噜啊),是葡萄牙语中“Luna”(月亮)的意思。

第2章Linux下Lua开发环境准备1、到官方网站下去下载/download.html(已下载好);2、切换到root用户;3、到本地目录下解压下载的源文件;4、cd lua-5.1;5、make linux(在linux环境下编译);6、make install,可以看到最后的几行执行过程;[cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.1 /usr/local/lib/lua/5.1cd src && cp lua luac /usr/local/bincd src && cp lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp /usr/local/include cd src && cp liblua.a /usr/local/libcd doc && cp lua.1 luac.1 /usr/local/man/man1]第3章第一个Lua 3.1helloworld没错,又是helloworld!1、在Linux环境下vi hello.lua2、在编辑模式下输入如下图所示代码;3、保存;4、编译:输入:lua hello.lua,即可看到第4章在C语言中调用Lua 4.1简单调用Lua脚本1、准备好lua脚本;2、编写C程序,具体代码如下图所示;3、编译C程序;gcc -I/usr/local/include/ -L/usr/local/lib/ -lm -DLUA_USE_READLINE testlua.c /usr/local/lib/liblua.a -o testlua -ldl4、运行C程序;./testlua4.2调用Lua函数具体可参考2addlua、3strupper、4substr文件夹内容,此处不再赘述第5章windows环境下访问mysql数据库1、安装windows环境下lua开发环境(可直接点击“LuaForWindows_v5.1.4-40.exe”安装);2、打开Lua编辑器;3、输入代码:[-- 读取驱动require "luasql.mysql"env = assert (luasql.mysql())-- 连接到数据源con = assert (env:connect("test", "root", "root", "10.30.11.105", 3306))-- 设置字符集,不然会出现中文乱码con:execute[[set names gbk]]-- 执行查询语句cur = assert (con:execute"SELECT name from newsinfo")-- 接收查询结果row = cur:fetch ({}, "a")-- 将结果遍历展示while row doprint(string.format("结果: %s", )) row = cur:fetch (row, "a")end-- 关闭各种你懂的cur:close()con:close()env:close()]4、运行结果;第6章参考文档在参考文件夹下有相关的参考资料,有需要可打开查看。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
print("------------") timer2 = createCountdownTimer(1) for i = 1, 3 do print(timer2()) end 输出结果: 999 998 997 -----------999 998 997
函数闭包(续)
Upvalue 一个函数所使用的定义在它的函数体之外的局部变量(external local variable)称为这个函数的upvalue。 在前面的代码中,函数countDown使用的定义在函数createCountdownTimer 中的局部变量ms就是countDown的upvalue,但ms对createCountdownTimer而 言只是一个局部变量,不是upvalue。 Upvalue是Lua不同于C/C++的特有属性,需要结合代码仔细体会。 函数闭包 一个函数和它所使用的所有upvalue构成了一个函数闭包。 Lua函数闭包与C函数的比较 Lua函数闭包使函数具有保持它自己的状态的能力,从这个意义上说,可以 与带静态局部变量的C函数相类比。但二者有显著的不同:对Lua来说,函数 是一种基本数据类型——代表一种(可执行)对象,可以有自己的状态;但 是对带静态局部变量的C函数来说,它并不是C的一种数据类型,更不会产生 什么对象实例,它只是一个静态地址的符号名称。

a={} b = { x = 1, ["hello, "] = "world!" } a.astring = "ni, hao!" a[1] = 100 a["a table"] = b function foo() end function bar() end a[foo] = bar --分别穷举表a和b for k, v in pairs(a) do print(k, "=>", v) end print("----------------------------") for k, v in pairs(b) do print(k, "=>", v) end 输出结果: 1 => 100 a table => table: 003D7238 astring => ni, hao! function: 003DBCE0 => function: 003DBD00 ---------------------------hello, => world! x => 1
函数
function foo(a, b, c) local sum = a + b return sum, c --函数可以返回多个值 end r1, r2 = foo(1, '123', 'hello') --平行赋值 print(r1, r2) 输出结果: 124 hello
函数(续)
函数定义 用关键字function定义函数,以关键字end结束 局部变量 用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也 是全局变量! 函数可以返回多个值 return a, b, c, ... 平行赋值 a, b = c, d 全局变量 前面的代码定义了三个全局变量:foo、r1和r2
一种简单的对象实现方式*
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 end o1 = create("Sam", 001) print("o1's name:", o1:GetName(), "o1's id:", o1:GetId()) o1:SetId(100) o1:SetName("Lucy") print("o1's name:", o1:GetName(), "o1's id:", o1:GetId()) 输出结果: o1's name: Sam o1's id: 1 o1's name: Lucy o1's id: 100
函数闭包
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
简单继承*(续)
优点: 简单、直观 缺点: 传统、不够动态
进阶话题
函数闭包(function closure) 基于对象的实现方式(object based programming)* 元表(metatable) 基于原型的继承(prototype based inheritance)* 函数环境(function envrionment) 包(package)
C/C++程序员的Lua快速入门 指南
Robert Z 2010-1
前言
本文针对的读者是有经验的C/C++程序员,希望了解Lua或者迅速抓住Lua的关键 概念和模式进行开发的。因此本文并不打算教给读者条件语句的语法或者函数定 义的方式等等显而易见的东西,以及一些诸如变量、函数等编程语言的基本概 念。本文只打算告诉读者Lua那些与C/C++显著不同的东西以及它们实际上带来了 怎样不同于C/C++的思考方式。不要小看它们,它们即将颠覆你传统的C/C++的世 界观! 本文一共分初阶、进阶和高阶三大部分,每个部分又有若干章节。读者应当从 头至尾循序渐进的阅读,但是标有“*”号的章节(主要讨论OO在Lua中的实现方 式)可以略去而不影响对后面内容的理解。读者只要把前两部分完成就可以胜任 Lua开发的绝大部分任务。高阶部分可作为选择。 本文不打算取代Lua参考手册,因此对一些重要的Lua函数也未做足够的说明。 在阅读的同时或者之后,读者应当在实践中多多参考Lua的正式文档(附录里列出 了一些常用的Lua参考资料)。 请访问本文的在线版本获得最新更新。 另外,作者还有一个开源的Lua调试器——RLdb以及一个讨论Lua的站点,欢迎 访问。 欢迎读者来信反馈意见。
初阶话题
数据类型 函数 表 简单对象的实现* 简单继承*
数据类型
八种基本类型: 数值(number) 内部以double表示 字符串(string) 总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串, 而是其超集。 布尔(boolean) 只有“true”或者“false”两个值。 函数(function) Lua的关键概念之一。不简单等同于C的函数或函数指针。 表(table) 异构的Hash表。Lua的关键概念之一。 userdata 用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义。 线程(thread) Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样。 nil 代表什么也没有,可以与C的象的实现方式*(续)
实现方式 把需要隐藏的成员放在一张表里,把该表作为成员函数的upvalue。 局限性 基于对象的实现不涉及继承及多态。但另一方面,脚本编程是否需要继承和 多态要视情况而定。
元表
t = {} m = { a = " and ", b = "Li Lei", c = "Han Meimei" } setmetatable(t, { __index = m}) --表{ __index=m }作为表t的元表 for k, v in pairs(t) do --穷举表t print(k, v) end print("-------------") print(t.b, t.a, t.c) 输出结果: ------------Li Lei and Han Meimei
一种简单的对象实现方式*(续)
对象工厂模式 如前面代码的create函数 用表来表示对象 把对象的数据和方法都放在一张表内,虽然没有隐藏私有成员,但对于简单 脚本来说完全可以接受。 成员方法的定义 function obj:method(a1, a2, ...) … end 等价于 function obj.method(self, a1, a2, ...) … end 等价于 obj.method = function (self, a1, a2, ...) … end 成员方法的调用 obj:method(a1, a2, …) 等价于 obj.method(obj, a1, a2, ...)

定义表(Table)的方式 a = {}, b = {…} 访问表的成员 通过“.”或者“[]”运算符来访问表的成员。 注意:表达式a.b等价于a[“b”],但不等价于a[b] 表项的键和值 任何类型的变量,除了nil,都可以做为表项的键。从简单的数值、字符串 到复杂的函数、表等等都可以;同样,任何类型的变量,除了nil,都可以 作为表项的值。给一个表项的值赋nil意味着从表中删除这一项,比如令a.b = nil,则把表a中键为“b”的项删除。如果访问一个不存在的表项,其值 也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil。
相关文档
最新文档