news 2026/4/24 23:46:59

Lua中 . 和 : 的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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**************************************************
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 17:43:28

19、JSTL格式化区域设置与数据库操作详解

JSTL格式化区域设置与数据库操作详解 1. 确定格式化区域设置 在进行格式化操作时, <fmt:formatNumber> 、 <fmt:parseNumber> 、 <fmt:formatDate> 和 <fmt:parseDate> 等操作通常不需要使用 <fmt:setLocale> 来指定格式化区域设置…

作者头像 李华
网站建设 2026/4/18 7:45:55

24、XML处理:解析、变量使用与XSLT转换

XML处理:解析、变量使用与XSLT转换 1. XML解析 在操作XML文档中的数据之前,需要使用 <x:parse> 动作来解析文档,其基本语法如下: <x:parse xml [systemId] [filter] {var [scope] | varDom [scopeDom]}/>此语法有两个必需属性: xml 和 var 或 varD…

作者头像 李华
网站建设 2026/4/23 3:24:00

28、JSTL格式化操作详解

JSTL格式化操作详解 1. JSTL格式化操作概述 JSTL(JavaServer Pages Standard Tag Library)的格式化操作主要用于解析和格式化数字、货币、百分比和日期。为了支持这些操作,有四个配置设置: - FMT_TIME_ZONE - FMT_LOCALE - FMT_FALLBACK_LOCALE - FMT_LOCALIZATION_C…

作者头像 李华
网站建设 2026/4/23 15:37:27

工业滤布市场研究报告:产业链、竞争格局与领先企业分析

根据QYResearch调研数据显示&#xff0c;2031年全球工业滤布市场规模预计达 12.8 亿美元&#xff0c;2025-2031 年复合增长率&#xff08;CAGR&#xff09;稳定在 3.4%。市场竞争呈现 “国际巨头主导、亚洲厂商崛起” 的格局&#xff0c;Sefar、GKD、BWF Envirotec 等国际品牌凭…

作者头像 李华
网站建设 2026/4/23 18:17:47

计算机毕业设计springboot基于微信小程序的体育选课系统 基于微信小程序的体育选课系统设计与实现 微信小程序平台下的体育选课系统开发

计算机毕业设计springboot基于微信小程序的体育选课系统hjggg9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;传统的体育选课模式已逐渐无法…

作者头像 李华
网站建设 2026/4/24 19:29:44

wangEditor处理站群平台pdf文档解析需求

企业级文档导入与粘贴解决方案 项目背景与需求分析 作为四川教育行业集团上市公司的项目负责人&#xff0c;我面临一个重要的技术集成需求&#xff1a;在企业网站后台管理系统中增强文章发布模块的功能&#xff0c;特别是Word文档处理能力。以下是详细的需求分析和解决方案。…

作者头像 李华