在Lua中,使用“:”和不使用“:”的函数有什么区别?
假设我们有两个函数声明:
function MyData:New
end
和
function New(MyData)
end
它们之间有什么区别?在继承和面向对象编程方面,使用 : 有什么特殊目的吗?我只能使用 : 调用使用 : 声明的函数吗?
我只使用过 C# - 所以如果要进行比较,那该是什么?
你应该在 Stack Overflow 上搜索,因为有很多类似的问题,但你提出了一系列问题,所以我不能说这是重复的。
Q:它们之间有什么区别?
A:使用冒号的一个方法会被添加到 MyData 表中,并且当调用时 Lua 解释器会在第一个参数之前自动插入一个“self”,该“self”指向调用“方法”所在的 MyData 实例。这与编写 MyData.New = function(self) end 相同。第二个签名有一个名为MyData的参数,并且是一个全局函数。它与 MyData 表或类无关。
Q:在继承和面向对象编程中使用“:”有特殊目的吗?
A:不会;这只是一种语法糖,使得当你调用 MyData.New 时,你只需写 MyData:New() 而不是笨拙的 MyData.New(MyData)。请注意,“new”函数通常用于创建类的实例,因此你不需要将这样的函数作为方法,而只需将其作为 MyData 表中的函数。对于继承和面向对象编程,你使用元表,并且这与“:”没有任何特殊方式互动。
Q:我只能使用“:”调用使用“:”声明的函数吗? A:不是的,正如上面提到的,这只是一种语法糖,你可以定义一种方式并以不同的方式调用。
Q:我之前只使用 C#,所以如果要进行比较,有什么可比较的吗? A:对于函数,冒号就像 C# 中的“.”,无论在调用还是定义中使用。Lua 中的“.”更像“属性”,在 C# 中没有函数的等效项。
MyData = {}--一个表
function MyData.func(self)
print('hello')
end
MyData:func()
MyData.func(MyData)--与上一个相同
function MyData:func2()--self是隐式的
print('hello')
end
MyData:func2()
MyData.func2(MyData)--与上一个相同
请注意,上面定义的 MyData 不是类,因为你不能创建它的“实例”(没有显示出来的附加工作)。一定要阅读 Lua.org 网站上的“Lua 编程”在线书籍,其中有很多这些概念的有用讨论。
Lua 并不是像其他编程语言一样有函数 声明,而是有函数定义表达式。你所使用的语法是函数定义表达式和赋值的简写形式。
你的两个例子中唯一区别是当第一个语句被执行时,一个新的函数会被创建并赋值给在变量 MyData 引用的表中的 New 字段,而第二种形式则是赋值给一个非字段变量(如果之前声明过就是本地变量,否则就是全局变量)。
请注意这些只是创建函数值的首次引用。像其他值一样,你可以把函数的引用赋值给任何变量并将它们作为参数传递。
如果在函数体中添加形式参数的使用,那么还会有另一个区别:第一个有一个隐式的命名为 self 的第一个参数。
如果在场景中添加函数调用,就会使用“:”语法,并在左侧是一个表达式。它应该引用一个表。右侧的标识符应该是该表中的一个字段,并且它应该引用一个函数。左侧表达式的值将作为第一个实际参数传递给该函数,随后是任何其他参数。
带有“:”的函数定义称为方法。带有“:”的函数调用称为方法调用。你可以使用任何函数调用语法构造对表中字段为函数值的函数的函数调用,其中第一个参数是对该表的引用。Lua 方法定义和方法调用语法使得使用起来更加方便,就像函数是实例方法一样。从这个角度来看,Lua 方法就像 C# 扩展方法。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
从 手册,第 3.4.10 节的结尾 改编: