lua学习笔记之一(C/C++程序员的Lua快速入门[初阶话题])
来源:互联网 发布:淮右军以人肉知乎 编辑:程序博客网 时间:2024/05/23 05:08
前言
本文针对的读者是有经验的C/C++程序员,希望了解Lua或者迅速抓住Lua的关键概念和模式进行开发的。因此本文并不打算教给读者条件语句的语法或者函数定义的方式等等显而易见的东西,以及一些诸如变量、函数等编程语言的基本概念。本文只打算告诉读者Lua那些与C/C++显著不同的东西以及它们实际上带来了怎样不同于C/C++的思考方式。不要小看它们,它们即将颠覆你传统的C/C++的世界观!
本文一共分初阶、进阶和高阶三大部分,每个部分又有若干章节。读者应当从头至尾循序渐进的阅读,但是标有“*”号的章节(主要讨论OO在Lua中的实现方式)可以略去而不影响对后面内容的理解。读者只要把前两部分完成就可以胜任Lua开发的绝大部分任务。高阶部分可作为选择。
初阶话题
1.八种基本类型: 如下表
基本类型
描述
备注
数值(number)
内部以double表示
字符串(string)
总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串, 而是其超集
布尔(boolean)
只有“true”或者“false”两个值。
函数(function)
Lua的关键概念之一。不简单等同于C的函数或函数指针。
表(table)
异构的Hash表。Lua的关键概念之一。
userdata
用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义。
线程(thread)
Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样。
nil
代表什么也没有,可以与C的NULL作类比,但它不是空指针。
2.函数
2.1 实例代码
function foo(a,b,c,...) local sum = a+breturn sum,c --函数可以返回多个值endr1,r2 = foo(1,"123","hello")--平行赋值print(r1,r2);
输出结果:
124 hello
2.2 函数基本使用方法
- 函数定义:
- 局部变量:
用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也是全局变量!
- 函数可以返回多个值:
- 平行赋值:
- 全局变量:
3.表
3.1 实现代码
local a = {}local b = {x = 1,["hello,"] = "world!"}a["astring"] = "ni,hao!"a[1] = 100a["a table"] = bfor k,v in pairs(a) doprint(k,"=>",v);end
输出结果:
1=>100
astring=>ni,hao!
a table=>table: 0xfd59570
3.2 表使用方法
- 定义表(Table)的方式
- 访问表的成员
通过“.”或者“[]”运算符来访问表的成员。
注意:表达式a.b等价于a[“b”],但不等价于a[b]
- 表项的键和值
任何类型的变量,除了nil,都可以做为表项的键。从简单的数值、字符串到复杂的函数、表等等都可以;同样,任何类型的变量,除了nil,都可以作为表项的值。给一个表项的值赋nil意味着从表中删除这一项,比如令a.b= nil,则把表a中键为“b”的项删除。如果访问一个不存在的表项,其值也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil。
4.一种简单的对象实现方式
4.1 实现代码
function create(name,id)local obj = {name = name,id = id}function obj:SetName(name)self.name = name endfunction obj:GetName()return self.nameendfunction obj:SetId(id)self.id = idendfunction obj:GetId()return self.idendreturn objendlocal myCreate = create("sam",001)for k,v in pairs(myCreate) doprint(k,"=>",v)endprint("myCreate's name:",myCreate:GetName(),"myCreate's id:",myCreate.GetId(myCreate))myCreate:SetId(100)myCreate:SetName("Hello Kity")print("myCreate's name:",myCreate:GetName(),"myCreate's id:",myCreate:GetId())
SetName=> function: 0x85efc50
GetId=> function: 0x85efc10
id=> 1
SetId=> function: 0x85efd00
GetName=> function: 0x85efce0
name=> sam
myCreate's name:sam myCreate's id:1
myCreate's name:Hello Kity myCreate's id:100
- 对象工厂模式
- 用表来表示对象
把对象的数据和方法都放在一张表内,虽然没有隐藏私有成员,但对于简单脚本来说完全可以接受。
- 成员方法的定义
- 成员方法的调用
obj:method(a1, a2, ...) 等价于obj.method(obj, a1, a2, ...)
5.简单继承*
5.1 实现代码
local function CreateRobot(name,id)local obj = {name = name,id = id}function obj:SetName(name)self.name = nameendfunction obj:GetName()return self.nameendfunction obj:SetId(id)self.id = idendfunction obj:GetId()return self.idendreturn objendlocal function createFootballRobot(name ,id ,position)local obj = CreateRobot(name ,id)obj.position = "right back"function obj:SetPosition(p)self.position = pendfunction obj:GetPosition() return self.positionendreturn objendlocal mycreateFootballRobot = createFootballRobot("Tom",1000,"广州")print("mycreateFootballRobot's name:",mycreateFootballRobot:GetName(),"myCreate's id:",mycreateFootballRobot:GetId(),mycreateFootballRobot:GetPosition())mycreateFootballRobot:SetName("麦迪")mycreateFootballRobot:SetId(2000)mycreateFootballRobot:SetPosition("北京")print("mycreateFootballRobot's name:",mycreateFootballRobot:GetName(),"myCreate's id:",mycreateFootballRobot:GetId(),mycreateFootballRobot:GetPosition())
输出结果:
mycreateFootballRobot's name:TommyCreate's id:1000right back
mycreateFootballRobot's name:麦迪myCreate's id:2000北京
5.2 简单继承优缺点
优点: 简单、直观
缺点: 传统、不够动态
参考文献《C/C++程序员的Lua快速入门》
- lua学习笔记之一(C/C++程序员的Lua快速入门[初阶话题])
- lua学习笔记之三(C/C++程序员的Lua快速入门[高阶话题])
- lua学习笔记之二(C/C++程序员的Lua快速入门[进阶话题])
- C/C++程序员的Lua快速入门
- lua入门之一:c/c++ 调用lua
- Lua学习笔记--C调用Lua
- Lua学习笔记--Lua调用C初探
- 通过例子学习Lua(5) ---- Lua与C交互入门
- Lua 入门学习笔记
- Lua学习笔记二之C中调用Lua
- Lua学习笔记三之从Lua中调用C
- Lua学习笔记:Lua 中的C Api 概述
- lua -->c c-->lua
- Lua 学习笔记:C API 遍历 Table
- lua 与 C交互 学习笔记
- Lua 学习笔记:C API 遍历 Table
- [LUA学习笔记03]LUA函数和C函数的相互调用
- Lua学习笔记二--在Lua中使用自己的C函数
- 在vc MFC下制作具有XP风格按钮等控件
- 信号量、互斥体和自旋锁
- 关闭联想台式机键盘的 Fn 功能
- SDHC卡写单块和读单块
- 1到100求和
- lua学习笔记之一(C/C++程序员的Lua快速入门[初阶话题])
- NSString字符串的连接及截取
- C++中静态成员函数访问非静态成员变量
- Sina IP地址查询接口
- 桑园受涝促恢复
- svn将分支合并到主干
- pthread_cond_signal和pthread_cond_wait简介
- 如何解决db2nodes.cfg line number“1”,Reason code“10”
- C#委托(笔记)