lua学习笔记之一(C/C++程序员的Lua快速入门[初阶话题])

前言 

    

    本文针对的读者是有经验的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+b
		return sum,c  --函数可以返回多个值
	end
	
	r1,r2 = foo(1,"123","hello")--平行赋值
	print(r1,r2);

输出结果:

124 hello 

 

2.2 函数基本使用方法

  • 函数定义:
                用关键字function定义函数,以关键字end结束

  • 局部变量:

                用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也是全局变量!

  • 函数可以返回多个值:
                return a, b, c, ...

  • 平行赋值:
                a, b = c, d

  • 全局变量:
                前面的代码定义了三个全局变量:foo、r1和r2 


3.表


3.1 实现代码

	local a = {}
	local b = {x = 1,["hello,"] = "world!"}
	a["astring"] = "ni,hao!"
	a[1] = 100
	a["a table"] = b
	
	for k,v in  pairs(a) do
		print(k,"=>",v);
	end

输出结果:

1=>100

astring=>ni,hao!

a table=>table: 0xfd59570


3.2 表使用方法

  • 定义表(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。 


4.一种简单的对象实现方式 


4.1 实现代码

	function create(name,id)
		local obj = {name = name,id = id}
		
		function obj:SetName(name)
			self.name = name 
		end
		
		function obj:GetName()
			return self.name
		end
		
		function obj:SetId(id)
			self.id = id
		end
		
		function obj:GetId()
			return self.id
		end
		return obj
	end
	
	local myCreate = create("sam",001)
	
	for k,v in pairs(myCreate) do
		print(k,"=>",v)
	end
	
	print("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


4.2对象实现描述

  • 对象工厂模式
                如前面代码的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, ...) 


5.简单继承*


5.1  实现代码

	local function CreateRobot(name,id)
		local obj = {name = name,id = id}
		
		function obj:SetName(name)
			self.name = name
		end
		
		function obj:GetName()
			return self.name
		end
		
		function obj:SetId(id)
			self.id = id
		end

		function obj:GetId()
			return self.id
		end
		return obj
	end

	
	local function createFootballRobot(name ,id ,position)
		local obj = CreateRobot(name ,id)
		obj.position = "right back"
		
		function obj:SetPosition(p)
			self.position = p
		end
		
		function obj:GetPosition() 
			return self.position
		end
		
		return obj
	end
	
	local 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快速入门》

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
非常感谢您的问题。关于您的问题,我可以为您提供一些信息和建议,但是我需要更多的上下文和细节,以便更好地理解您的需求。 首先,发布/订阅模式是一种常见的软件设计模式,用于在多个应用程序之间传递消息和通信。在这种模式中,有一个或多个发布者将消息发布到一个或多个主题,然后订阅者通过订阅特定主题来接收相关消息。这种模式通常用于异步和松散耦合的应用程序之间的通信。 针对您的问题,如果您想使用Lua语言搭建一个发布/订阅模式框架,您可以考虑使用LuaSocket库或LuaNATS库。 LuaSocket是一个Lua语言的网络支持库,它提供了Socket API的实现,并支持TCP和UDP协议。您可以使用它来实现发布/订阅模式的网络通信。具体来说,您可以使用Socket API中的socket()函数创建一个TCP或UDP套接字,然后使用bind()函数将套接字绑定到本地端口,再使用send()函数向主题发布消息,最后使用recv()函数从主题订阅消息。 而LuaNATS是一个Lua语言的NATS客户端库,它提供了对NATS协议的实现,可以方便地实现基于NATS的发布/订阅模式通信。具体来说,您可以使用LuaNATS提供的API创建一个连接到NATS服务器的客户端,并在客户端上订阅/取消订阅主题,然后通过客户端发送和接收主题消息。 除了这些库之外,还有许多其他的Lua语言库可以用于实现发布/订阅模式框架,具体选择取决于您的实际需求和环境。 希望这些信息和建议能为您提供一些帮助。如果您有任何其他问题或需要更多帮助,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值