当前位置: 首页 > news >正文

Lua中 . 和 : 的区别

文章目录

  • 1、基础介绍
  • 2、稍微深入的了解
    • 2.1 定义的函数的示例
    • 2.2 定义的函数的示例

1、基础介绍

Car={Name="BYD",Price=12}print("Car 的地址 --->",Car)print(Car.Name)-- 访问属性-- print(Car:Name) 报错print(string.rep("*",20))functionCar:find1()print(": 定义的函数并且使用 : 调用时 self 的地址--->",self)endfunctionCar.find2()print(". 定义的函数并且使用 . 调用时 self 的地址--->",self)endCar:find1()Car.find2()print(string.rep("*",20))functionCar:find3()print(": 定义的函数并且使用 . 调用时 self 的地址--->",self)endfunctionCar.find4()print(". 定义的函数并且使用 : 调用时 self 的地址--->",self)endCar.find3()Car:find4()

运行结果:

Car 的地址---> table: 038F9CA0BYD********************:定义的函数并且使用:调用时 self 的地址---> table: 038F9CA0.定义的函数并且使用.调用时 self 的地址---> nil********************:定义的函数并且使用.调用时 self 的地址---> nil.定义的函数并且使用:调用时 self 的地址---> nil
Car={Name="BYD",Price=12}print("Car 的地址 --->",Car)print(Car.Name)-- 访问属性-- print(Car:Name) 报错print(string.rep("*",20))functionCar:find1(self)print(": 定义的函数并且使用 : 调用时 self 的地址--->",self)endfunctionCar.find2(self)print(". 定义的函数并且使用 . 调用时 self 的地址--->",self)endCar:find1()Car.find2()print(string.rep("*",20))functionCar:find3(self)print(": 定义的函数并且使用 . 调用时 self 的地址--->",self)endfunctionCar.find4(self)print(". 定义的函数并且使用 : 调用时 self 的地址--->",self)endCar.find3()Car:find4()

运行结果:

Car 的地址---> table: 039D96E0BYD********************:定义的函数并且使用:调用时 self 的地址---> nil.定义的函数并且使用.调用时 self 的地址---> nil********************:定义的函数并且使用.调用时 self 的地址---> nil.定义的函数并且使用:调用时 self 的地址---> table: 039D96E0

从上面我们知道:

  • 使用点号.来访问 table 的属性,不能使用:来访问 table 的属性。
  • 使用.:都可以用来访问 table 的函数。
  • 使用:调用使用的.定义的函数,默认函数传入的第一个参数是 table 本身。
  • 使用:定义的函数并且使用:调用时,定义的函数中默认有一个变量self。而不是使用:定义的函数并且使用:调用时,定义的函数中的是没有self变量的, 这个时候是不需要显示传入 self 参数的。

2、稍微深入的了解

通过上面的介绍,我们对.:有一个简单的了解,接下我们再稍微深入的了解下。这里先说结论,然后再看例子。
.:的区别在于使用 :

  • 使用:定义的函数时,函数隐含 self 参数,使用:调用函数会自动传入 table 至 self 参数。而使用.定义的函数并没有这样。
  • Lua 中使用:可以实现面向对象方式的调用。:只是语法糖,它同时在方法的声明与实现中增加了一个名为 self 的隐藏参数,这个参数就是对象本身。

2.1 定义的函数的示例

classA={}print("ClassA 地址 -->",classA)functionclassA:getob(name)print("classA:getob 中self 的地址 -->",self)ob={}setmetatable(ob,self)self.__index=self self.name=namereturnobendfunctionclassA:getself()returnselfendc1=classA:getob("A")print("c1 地址 -->",c1)c2=classA:getob("B")print("c2 地址 -->",c2)print(string.rep("*",30))print(c1:getself())print(c2:getself())print(string.rep("*",30))----------------------继承------------------------classB=classA:getob()----非常重要,用于获取继承的selffunctionclassB:getob(name,address)ob=classA:getob(name)setmetatable(ob,self)self.__index=self self.address=addressreturnobendc3=classB:getob("gray.yang","shenzhen")print("c3 地址 -->",c3)print(c3:getself())

运行结果:

ClassA 地址--> table: 0392D128classA:getob 中self 的地址--> table: 0392D128c1 地址--> table: 0392D010classA:getob 中self 的地址--> table: 0392D128c2 地址--> table: 0392CE80******************************table:0392D010 table:0392CE80******************************classA:getob 中self 的地址--> table: 0392D128classA:getob 中self 的地址--> table: 0392D128c3 地址--> table: 03933050table:03933050

2.2 定义的函数的示例

classA={}print(classA)functionclassA.new(cls,...)--定义类方法时使用"."号,不适用隐式传参print(cls)this={}setmetatable(this,cls)cls.__index=cls--将元表的__index设为自身,访问表的属性不存在时会搜索元表cls.init(this,...)--初始化表,注意访问类的方法都是".",此时不会隐式传入参数returnthisendfunctionclassA.init(self,name)print("classA.init -->",self)self.name=nameendfunctionclassA.getname(self)print("classA.getname -->",self)returnself.nameend-- 注意这里的调用方式,是 : 。p=classA:new("gray.yang")print("p --->",p)print(p:getname())print(string.rep("*",50))

运行结果:

table:0381B888 table:0381B888 classA.init--> table: 0381B8D8p---> table: 0381B8D8classA.getname--> table: 0381B8D8gray.yang**************************************************
http://www.cnnetsun.cn/news/65985.html

相关文章:

  • 18、日期和时间的格式化、解析及时间区域的使用
  • VisionPro CogIPOneImageTool1 工具超详细解释(含内部功能全解析)
  • VisionPro CogIDTool 工具超深度详解(技术细节 + 实战配置版)
  • 让 BI 拥有‘领域大脑’:智能 BI 如何实现 AI 级精准数据查询
  • 提示工程架构师的战略规划:提示系统生命周期管理
  • 条形码识别与定位:基于FCOS框架的多类型条码检测与识别技术详解
  • AutoGPT能否用于学术文献综述?研究辅助工具测评
  • 如何用AutoGPT实现任务全自动执行?深度解析开源大模型能力
  • Mapbox GL JS 核心表达式:`in` 包含判断完全教程
  • Web3双核引擎:当AI量化金融大脑,遇见DAO社交生态灵魂
  • CEX开发困局:当达普韦伯为交易所注入“数字灵魂”
  • AutoGPT镜像集成指南:如何嵌入现有业务系统?
  • AutoGPT项目活跃度分析:GitHub星标增长趋势
  • AutoGPT能否生成短视频脚本?内容创作新方式
  • 超越ChatGPT!教你开发能自主完成复杂任务的AI智能体,代码开源
  • 震惊!AI Agent智商税?Google最新研究:盲目堆叠智能体可能导致性能暴跌70%
  • AI Agent“杀疯了“!大模型时代,你的编程技能该“内卷“还是“躺平“?
  • 【AI神器】Claude Code四大神器全解析!小白程序员也能秒变效率王者,Command/Skill/Agent/MCP一次搞懂!
  • AutoGPT能否接入企业微信?组织内协作场景落地
  • 震惊!原来AI编程开发这么简单:LLM、Agent与Workflow三兄弟协同工作原理大揭秘,小白也能秒变AI达人!
  • 图灵奖大佬怒怼大模型:LLM不是通向AGI的路径!下一波AI革命竟是洗碗倒水?程序员必看!
  • 从“十五五”规划建议看数字孪生重点发展方向
  • Qwen3-32B中文理解能力为何如此出色?内部机制揭秘
  • BPAdaboost模型:以BP神经网络为‘弱‘分类器的强分类器构建方法
  • 16、科学计算实用指南:从矩阵运算到生物信息学
  • LobeChat文件上传功能怎么用?处理PDF、Word超简单
  • BTC波动加剧之际,投资者如何选择可靠的数字资产观察平台?
  • 基于springboot的水果购物商城管理系统的设计与实现_5n1fg985
  • 计算机毕业设计springboot家庭理财系统 基于 SpringBoot 的个人家庭资产管理系统 SpringBoot+Vue 的智能化家庭财务分析与规划平台
  • 论文写作新范式:基于9款AI工具的实战评测,开题报告与草稿高效产出