Nodejs 开发者求教:Lua 里对象后边冒号和点号之间区别是什么?

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

Nodejs 开发者求教:Lua 里对象后边冒号和点号之间区别是什么?

JS 里全点号就搞定了, 在 Lua 的教程里看到个 file:seek 之类的, 这是什么意思啊?

5 回复

在Lua中,对象方法的调用方式有两种:使用冒号(:)和使用点号(.)。这两种方式的主要区别在于隐式参数self的处理。

  1. 点号 (.):

    • 使用点号时,你需要显式地传递对象本身作为第一个参数。
    • 这种方式更接近于传统的面向对象编程中的函数调用方式。
  2. 冒号 (:):

    • 使用冒号时,Lua会自动将调用该方法的对象作为第一个参数传递给该方法,这相当于Java或C#中的this关键字。
    • 这种方式更符合Lua中面向对象编程的习惯。

示例代码

假设我们有一个文件对象,并且我们想定义一个方法来移动文件的读写位置:

-- 定义一个文件对象
local file = {}

-- 使用点号
function file.seek_dot(self, origin, offset)
    print("Using dot:", self, origin, offset)
end

-- 使用冒号
function file.seek_colon(self, origin, offset)
    print("Using colon:", self, origin, offset)
end

-- 创建一个实例
local instance = {name = "example"}

-- 调用点号方式的方法
file.seek_dot(instance, "set", 10)  -- 输出: Using dot: table: 0x7f8b3c403b90 set 10

-- 调用冒号方式的方法
file:seek_colon("set", 10)  -- 输出: Using colon: table: 0x7f8b3c403b90 set 10

解释

  • 点号方式 (file.seek_dot(instance, "set", 10)):

    • 我们需要显式地传递instance作为第一个参数self
  • 冒号方式 (file:seek_colon("set", 10)):

    • Lua自动将file作为第一个参数传递给seek_colon方法,所以我们不需要显式传递它。

总结来说,冒号方式更简洁,更符合Lua的面向对象编程习惯。而点号方式则更加灵活,允许你在方法定义和调用时有更多的控制。


静态函数和成员函数的区别?

不懂ei, 怎么 Lua 还做这样的区分呢, 那有没有规律的?

大致摸清楚了, 考虑到与 JS 相似度, Lua 设计得好奇怪…

-- 成员方法的定义
function obj:method(a1, a2, ...)  end -- 等价于
function obj.method(self, a1, a2, ...)  end -- 等价于
obj.method = function (self, a1, a2, ...)  end
-- 成员方法的调用
obj:method(a1, a2, …) -- 等价于
obj.method(obj, a1, a2, ...)

参考: http://sebug.net/paper/books/lua/Lua快速入门.pdf

在 Lua 中,对象后边的冒号(:)和点号(.)有明显的区别。具体来说:

  1. 点号(.:用于访问对象的属性或方法。
  2. 冒号(::定义了一个方法,并且会隐式地传递一个参数 self,代表调用该方法的对象。

示例代码

假设我们有一个文件对象 file,并且它有一个方法 seek。在 Lua 中,你可以这样使用:

-- 创建一个文件对象
local file = {}

-- 使用点号定义一个方法
function file:seek(where)
    print("Seeking from position:", where)
end

-- 使用点号访问并调用该方法
file:seek("start")  -- 这里会隐式传递 file 作为第一个参数 self

-- 相当于显式传递 self
file.seek(file, "start")

在这个例子中:

  • file:seek("start") 等价于 file.seek(file, "start")
  • file:seek 定义时使用了冒号,所以 seek 方法的第一个参数是 self,即 file 对象本身。

通过这种方式,Lua 提供了一种更简洁的方式来定义和调用对象的方法。如果你熟悉 JavaScript,可以将 : 视为一种语法糖,简化了方法调用中的 self 参数传递。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!