首页 > 其他分享 >lua中 . 和 : 的区别

lua中 . 和 : 的区别

时间:2023-06-16 19:22:23浏览次数:49  
标签:区别 -- self classA lua 地址 print table

最近项目中使用到了 lua,因为之前没怎么接触过,特此记录下自己在学习过程中疑惑的地方。

在使用lua 进行编码的过程中,我们经常会使用到.:,但是对于刚开始接触lua的我来说,对这两者的使用还是感到时常感到疑惑,接下来我们一起看看几个例子,来感受两者的区别。如果发现文中错误的地方,请不吝赐教,谢谢!

1、基础介绍

接下来,我们看看下面的例子,来了解.:的基础用法。

Car = {Name="BYD", Price=12}

print("Car 的地址 --->", Car)

print(Car.Name) -- 访问属性
-- print(Car:Name) 报错


print(string.rep("*", 20))

function Car:find1()
	print(": 定义的函数并且使用 : 调用时 self 的地址--->", self)
end

function Car.find2()
	print(". 定义的函数并且使用 . 调用时 self 的地址--->", self)
end

Car:find1()
Car.find2()


print(string.rep("*", 20))

function Car:find3()
	print(": 定义的函数并且使用 . 调用时 self 的地址--->", self)
end

function Car.find4()
	print(". 定义的函数并且使用 : 调用时 self 的地址--->", self)
end

Car.find3()
Car:find4()

运行结果:

Car 的地址 ---> table: 038F9CA0
BYD
********************
: 定义的函数并且使用 : 调用时 self 的地址--->   table: 038F9CA0
. 定义的函数并且使用 . 调用时 self 的地址--->   nil
********************
: 定义的函数并且使用 . 调用时 self 的地址--->   nil
. 定义的函数并且使用 : 调用时 self 的地址--->   nil

大家测试的时候,可以自己试一试。

从上面我们知道:

  • 使用点号.来访问 table 的属性,不能使用:来访问 table 的属性。
  • 使用.:都可以用来访问 table 的函数。
  • 使用:定义的函数并且使用:调用时,定义的函数中默认有一个变量self。而不是使用:定义的函数并且使用:调用时,定义的函数中的是没有self变量的。

2、稍微深入的了解

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

.: 的区别在于使用 :

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

2.1 : 定义的函数的示例

classA={}
print("ClassA 地址 -->", classA)
function classA:getob(name)
    print("classA:getob 中self 的地址 -->", self)
    ob={}
    setmetatable(ob,self)
    self.__index=self
    self.name=name
    return ob
end

function classA:getself()
    return self
end

c1=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()    ----非常重要,用于获取继承的self
function classB:getob(name,address)
    ob=classA:getob(name)
    setmetatable(ob,self)
    self.__index=self
    self.address=address
    return ob
end

c3=classB:getob("gray.yang","shenzhen")
print("c3 地址 -->", c3)
print(c3:getself())

运行结果:

ClassA 地址 --> table: 0392D128
classA:getob 中self 的地址 -->  table: 0392D128
c1 地址 -->     table: 0392D010
classA:getob 中self 的地址 -->  table: 0392D128
c2 地址 -->     table: 0392CE80
******************************
table: 0392D010
table: 0392CE80
******************************
classA:getob 中self 的地址 -->  table: 0392D128
classA:getob 中self 的地址 -->  table: 0392D128
c3 地址 -->     table: 03933050
table: 03933050

2.2 . 定义的函数的示例

classA={}
print(classA)
function classA.new(cls,...)     --定义类方法时使用"."号,不适用隐式传参
	print(cls)
    this={}
    setmetatable(this,cls)
    cls.__index=cls           --将元表的__index设为自身,访问表的属性不存在时会搜索元表
    cls.init(this,...)        --初始化表,注意访问类的方法都是".",此时不会隐式传入参数
    return this
end

function classA.init(self,name)
	print("classA.init -->", self)
    self.name=name
end

function classA.getname(self)
	print("classA.getname -->", self)
    return self.name
end

-- 注意这里的调用方式,是 : 。
p=classA:new("gray.yang")
print("p --->", p)
print(p:getname())
print(string.rep("*",50))

运行结果:

table: 0381B888
table: 0381B888
classA.init --> table: 0381B8D8
p --->  table: 0381B8D8
classA.getname -->      table: 0381B8D8
gray.yang
**************************************************

熟悉其他面向语言的同学,看了上面的例子,应该对.:有了了解,接下来自己平常多写写就明白了。

参考资料

Lua 面向对象

标签:区别,--,self,classA,lua,地址,print,table
From: https://www.cnblogs.com/huageyiyangdewo/p/17486357.html

相关文章

  • Html中空格的区别和使用
    1.半角不断行空格( )作用:用于在HTML中插入一个空格。相同点:与普通空格相比,该空格不会被浏览器忽略或合并。注意事项:这个空格占据的宽度受字体影响很明显。在中文布局中可能会出现上下两行对齐差生偏差的问题。2.半角空格( )作用:用于在HTML中插入一个半角空格。相同点:与"......
  • 什么是HMI和SCADA?两者有什么区别
    前言几十年来,工业控制系统在工业自动化中发挥了重要作用,它允许过程制造商从生产车间采集、分析、处理数据。在当今瞬息万变的工业环境中,制造商和公用事业公司必须采用现代HMI/SCADA和数字化转型,以跟上变化的步伐,应对不断增长的运营挑战并保持竞争力。HMI/SCADA软件在世界各地运行工......
  • Python - 方法参数中,带self和不带self的区别
    不带self该python文件中,没有类的概念。因此所有的方法参数中,没有self#文件名solution.pydefpartition(head:Optional[ListNode],x:int)->Optional[ListNode]:#...if__name__=='__main__':#注意这里的区别...partition() 如果未来要在其他类里......
  • 什么是HMI和SCADA?两者有什么区别
    前言几十年来,工业控制系统在工业自动化中发挥了重要作用,它允许过程制造商从生产车间采集、分析、处理数据。 在当今瞬息万变的工业环境中,制造商和公用事业公司必须采用现代HMI/SCADA和数字化转型,以跟上变化的步伐,应对不断增长的运营挑战并保持竞争力。HMI/SCADA软件在世界各......
  • web worker进程和线程的区别,Chrome 中有哪些常⻅进程,如果我有⼀个耗时很⻓的同步计算
    进程(Process)和线程(Thread)都是操作系统中用于多任务处理的概念。简单地说,一个进程就是一个程序的执行空间,而一个线程则是在执行空间内独立运行的执行路径。区别:进程是系统分配资源的最小单位,线程是操作系统调度的最小单位。各个进程之间是独立的,各个线程之间共享一些资源。创......
  • “==”和“equals”的区别
    “==”既可以比较引用对象,也可以比较基本数据类型。当是引用对象时,比较其地址是否一样,是否为同一对象。基本数据类型则比较其值。“equals”是object的一个方法。比较时看是否重写equals方法。默认是比较是否为同一对象,但是例如String类重写了,可以比较字符串值是否相等......
  • .js .jsx .ts .tsx的区别
    .js是javascript文件的扩展名,例如main.js。.jsx是javascript文件并表明使用了JSX语法。.ts是typescript文件的扩展名.tsx表明是typescript文件并使用了JSX语法。https://zhuanlan.zhihu.com/p/435385184......
  • 软件测试|SQL分类大概有几种?SQL中什么是主键和外键,它们之间的区别是什么?
    前言之前一个朋友面试测试开发岗位,面试官问了这个问题,朋友觉得自己没有很好回答这个问题,面试结束之后找到我,我只能帮他总结成这样了,希望能够帮助到那位朋友。获取更多技术资料,请点击!SQL语言分为五大类:DDL(数据定义语言)-Create、Alter、Drop这些语句自动提交,无需用Commit......
  • JAVA面试题解惑系列(四)——final、finally和finalize的区别
    关键字:java面试题finalfinallyfinalize作者:臧圩人(zangweiren)final、finally和finalize的区别是什么?这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是......
  • window.parent与window.opener的区别
    window.parent与window.opener的区别javascript调用主窗口方法2007-11-3013:42在这里总结一下,javascript调用父窗口(父页面)的方法。1:  window.parent是iframe页面调用父页面对象举例:a.html<html><head><title>父页面</title></head......