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

  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。
相关文档
最新文档