Lua 函数前的冒号和点号,你知道他们的区别吗?

Lua中 . : 的区别及使用场景 `:``是两个不同的操作符,它们在面向对象编程函数调用中有着不同的用途语义。本文将详细解释这两个操作符的区别,并为您提供相应的源代码示例。,该方法使用冒号语法定义。当我们使用冒号操作符调用方法时,Lua会自动将调用方法时的表作为第一个参数传递给方法。冒号操作符主要用于调用表中的方法,并传递表自身作为第一个参数。这种方式适用于面向对象编程中的方法调用。操作符,我们可以访问表中的字段,并获取它们的值。需要注意的是,冒号操作符只是一种语法糖,实际上它是通过。因此,我们也可以使用。在上面的示例中,我们在表。 阅读详情

1. 函数前的冒号和点号

点号(.)和冒号(:)的区别主要在于是否自动处理self参数。

在Lua中,函数定义时前面有点号(.)和冒号(:)的区别主要体现在函数如何处理其第一个参数,即隐式的self参数。具体来说:

  • 使用点号(.)定义或调用函数时,函数就是一个普通的函数,不会自动处理self参数。这种方式通常用于访问模块或表中的函数,而不是对象的方法。

  • 使用冒号(:)定义或调用函数时,Lua会自动将调用该方法的表作为第一个参数传递给函数,这个参数通常被命名为self。这种方式用于定义和调用对象的方法,能够让你在函数内部访问和操作对象的状态。

两者的区别如下述例子所示:

local myTable = {}
myTable.value = 5

function myTable:setValue1(val)
    self.value = val
end

function myTable:getValue1()
    return self.value
end

function myTable.setValue2(table, val)
	table.value = val
end

function myTable.getValue2(table)
    return table.value
end

-- 使用冒号调用,Lua会自动把myTable作为第一个参数传递给setValue
myTable:setValue1(10)
print(myTable:getValue1())  -- 输出:10

-- 使用点号调用,需要显式传递myTable作为参数
myTable.setValue2(myTable, 20)
print(myTable.getValue2(myTable))  -- 输出:20

在这个例子中,setValue函数使用了冒号定义,所以当你使用myTable:setValue(10)调用它时,myTable自动作为第一个参数(即self)传递给setValue。而getValue函数使用了点号定义,所以需要显式地将myTable作为参数传递给它。

2. 全局函数和局部函数

如果Lua函数定义或调用时既没有使用点号(.)也没有使用冒号(:),那么这个函数就被视为一个普通的全局函数或局部函数,不涉及任何隐式的self参数传递。这种情况下,函数的行为和参数传递完全基于显式提供的参数,与对象或表没有直接的关联。

2.1 全局函数

如果函数直接定义在脚本的顶级作用域中,没有绑定到任何表上,那么这个函数就是一个全局函数。全局函数可以在它们被定义的任何地方被调用,除非被局部作用域的同名变量遮蔽。

function globalFunction()
    print("这是一个全局函数")
end

globalFunction()  -- 调用全局函数

2.2 局部函数

如果函数使用local关键字定义,那么这个函数就是一个局部函数,它只能在定义它的那个作用域(及其子作用域)中被访问。

local function localFunction()
    print("这是一个局部函数")
end

localFunction()  -- 调用局部函数

这种方式定义的函数不涉及到面向对象编程中的self参数概念,也不需要通过某个对象或表来调用。它们通常用于执行不特定于任何对象状态的任务,或者用于组织代码逻辑,提高代码的复用性和模块化。

没有使用点号或冒号的函数调用或定义,意味着它是一个独立的、不自动关联任何表的普通函数,这种函数的调用和参数传递完全取决于你在调用时所提供的参数。

理解Lua冒号区别及适用场合 Lua冒号的应用在函数的定义调用这两种场合可以互相替换,抛砖引玉,先给出Lua5.3参考手册对于冒号区别的解释,例子略有简化: 函数的定义:冒号语法可以用来定义方法, 就是说,函数可以有一个隐式的形参self。 因此,如下语句 function f(params) body end是这样一种写法的语法糖function f(self, params) body end ... 阅读详情

相关推荐

Autosar配置——导入DBC后配置SecOC同步报文同步请求报文

在Autosar中,安全性是一个重要的考虑因素,而SecOC(Secure On-Board Communication)是一种用于保护通信数据完整性安全性的安全机制。在上述示例中,我们配置了同步报文同步请求报文的属性。接下来,我们需要在Autosar中配置同步报文同步请求报文。同步报文用于在通信双方之间同步SecOC状态,而同步请求报文用于请求SecOC的状态信息。通过以上配置,我们成功地导入了DBC文件,并在Autosar系统中配置了SecOC同步报文同步请求报文。希望以上信息对您有所帮助!

CyberSphinx的博客 625

关于lua中的冒号(":")(".")的区别

一、定义方法的区别 1、冒号定义方法,默认会接受self参数;而定义的时候,默认不会接受self参数 例: (1)冒号定义 function class:test()   --这里会接受self参数,比如   print(self.a,self.b)   在这里self就是class对象本身,因此不会出错 end (2)定义 function class.test() ...

weixin_34414650的博客 872

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3205

疯狂的lua|学习笔记(一)|冒号“:”的用法,“.”的区别

lua工程师的精神状态普遍堪忧......

weixin_48343145的博客 6万+

Lua冒号区别

事先声明,本文主要用于个人笔记,不保证原创性。

kxxxxc的博客 1372

Lua中使用冒号区别

Lua中使用(.)与冒号(:)的区别在于: 在函数定义的时候使用:会默认接收self参数; 在函数调用的时候使用:会默认传递调用者自己为参数; 在函数定义调用的时候使用.则需要显式接收或者传递self参数。 local test = {} function test:funcA() print("I`m funcA") end function test.funcB(self)...

fightsyj的博客 3517

理解lua 语言中的冒号与self

lua编程中,经常遇到函数的定义调用,有时候用调用,有时候用冒号调用,这里简单的说明一下原理。 girl = {money = 200} function girl.goToMarket(girl ,someMoney) girl.money = girl.money - someMoney end girl.goToMarket(girl ,100) print(girl.mone

继续沉淀! 3万+

Lua 冒号

Lua 冒号

缥缈的云 专栏 2487

Lua中的self、冒号

介绍 在lua中,表拥有一个标识:self。self类似于this指针,大多数面向对象的语言(比如C++、C#)都隐藏了这个机制,在编码时不需要显式地声明这个参数,就可以在方法内使用this。在lua中,提供了冒号操作符来隐藏self参数,比如: local t = {a = 1, b = 2} function t:Add() return (self.a + self.b) end print(t.Add()) 冒号实现同样的功能 冒号有两个作用:1.对于方法定义来说,提供了一个额外的隐藏形参

Katarina_777的博客 1751

Lua语言中的冒号.

lua编程中,经常遇到函数的定义调用,有时候用调用,有时候用冒号调用。 girl = {money = 200} function girl.goToMarket(girl ,someMoney) girl.money = girl.money - someMoney end girl.goToMarket(girl ,100) print(girl.money)...

return9的博客 2731

Lua中调用函数使用冒号区别

1.初学者最易混乱Top1——调用函数时用还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(100, 20); mSprite:setPosition(100, 20); 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?这两种形式是有区别的,区别很大,但只有一个。不过,暂时...

ddry47579的博客 164

Lua——函数冒号区别

Lua——函数冒号区别 函数使用冒号表示该函数默认传递一个self参数,并且该参数指向调用者;使用则不会传递一个self参数,例如: local person = {} function person:talk(mes) print("talk",self,mes) end function person:sleep(time) print("sleep",self,time) end person:talk("aaa") person.sleep(5) 输出结果如下:

Fujige 853

lua 中的":"(冒号)语法糖

定义一个模块 local M = {} function M.MyFunc(self, a) --方法体 end return M 调用模块中的方法, 下面两种调用方式作用是一样的 local M = require('M') M.MyFunc(M,a) local M = require('M') M:MyFunc(a) 使用冒号调用模块里的方法时会将冒号的自身作为参...

oncruise的博客 7244

lua中.:的区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34128534的博客 1422

lua 中 . : 的区别

分析:函数调用时用的 . 不会传递self 只传递1 2 3,而ceshi函数声明时用的 : 默认有一个self在第一位去接收,ceshi函数能接收4个参数,即 self a b c ,所以c没有接收参数为nil。分析:调用ceshi函数时用的:默认传递self为第一个参数,但是函数声明的时候用的 . 所以不会有默认隐藏的self去接收,此时传递参数为 self 1 2 3 但是ceshi函数只接收3个参数所以3被抛弃。分析:默认不传递self,默认不接受self。分析:默认传self,默认接受self。

Flytiger 1392

lua冒号(:)与(.)的区别

lua开发中我们经常会混淆这两者之间的区别,下面通过一个示例来解释: Class = {} Class.__index = Class function Class.new(x,y) local cls = {} setmetatable(cls, Class) cls.x = x cls.y = y return c...

ahyz9638的博客 211

Lua使用冒号区别

记录Lua知识

weixin_50702814的博客 661

Lua学习笔记之“.”“:”的作用用法

目录 1、博客介绍 2、内容 含义: “:”声明方法并采取“:”的形式调用: “:”声明方法并采取“.”的形式调用: “.”声明方法并采取“.”的形式调用: “.”声明方法并采取“:”的形式调用: 3、推送 4、结语 1、博客介绍 本篇博客作为Lua学习笔记之一,介绍关于方法中“.”“:”的用法不同含义,我们知道在声明方法的时候可以采用“.”或者“:”的写法...

孙君的空间站 5万+

Lua编程基础】实测Lua冒号区别

Lua中成员函数的定义应该约定一种形式而不要冒号同时使用 一:在lua中面向对象编程的时候都要用冒号 使用冒号声明函数的时候会把self作为参数隐藏在里面,如果这个时候用就会报错 -- 基础类方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; self.perimet

纯技术流日常开发商业开发记录总结等 1490

20200511125568816881_stm32血压计_STM32血压_血压计程序源码_血压计_血压_源码.zip

20200511125568816881_stm32血压计_STM32血压_血压计程序源码_血压计_血压_源码.zip

上一篇: HTTP Cookie 你了解多少?
下一篇: 5 分钟掌握一个常用正则表达式 No.1 竖线
Coder567
博客等级 码龄9年 137粉丝 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Coder567

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

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

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

打赏作者

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

抵扣说明:

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

余额充值