lua - Lua中表成员函数在哪里定义

标签 lua lua-table

据我了解,有多种方法可以在 Lua 中为表定义成员函数。例如,以下两个看起来是等价的:

-- method a)
local table1 = {x = 1, y = 2}
function table1:myfunc()
    return self.x + self.y
end

-- method b)
local table2 = {
    x = 1,
    y = 2,

    myfunc = function(self)
        return self.x + self.y
    end,
}

以前使用过 Python,我的直觉是使用方法 b) 来使事物更整齐地组合在一起。然而,阅读示例似乎人们通常按照惯例使用方法 a)。不过,我找不到任何客观理由来说明为什么它应该更优越。

事实上,似乎恰恰相反,在初始化表时至少有理由前向声明函数变量,如下所示:

local table3 = {x = 1, y = 2, myfunc}
function table3:myfunc()
    return self.x + self.y
end

这样 Lua 从一开始就知道成员的存在并且可以正确地设置哈希,而增加现有表的成员数量可能需要重新哈希(尽管我无法想象这实际上会成为一个明显的性能问题,除非你对大量的小表执行此操作)。对于来源比较:https://www.lua.org/gems/sample.pdf

那么有什么理由不在表本身的定义过程中直接定义成员函数呢?还是只是一些语法糖(function name() 语法和冒号)当时不可用?

最佳答案

作为一个函数式编程的 Nerd ,我更喜欢方法 b,因为它一次定义了所有表,而不是为我们需要添加的每个方法都改变一次。您应该注意的一件事是某些方法可能会相互调用,使用本地方法比调用 self:myfunc() 更快。​​

local function myfunc(self)
  return self.x + self.y
end

local myTable = {
  x = 1,
  y = 2,
  myfunc = myfunc,

  moreMyfunc = function(self)
    return myfunc(self) * 2
  end,
}

如果方法之间缺乏对称性很麻烦,您可以将所有方法设为本地并将它们添加到表构造函数中,就像我刚刚对 myfunc 所做的那样。

Egor 提出了另一个重点(如果表是类,则更相关):

Method a allows you to access variable table1 as upvalue from inside your functions. Method b doesn't allow this.

在这种情况下,我会前向声明表名。这样做的好处是只需更改一次变量,而不是多次更改表。

local myTable

local function myfunc(self)
  return self.x + self.y
end

local function moreMyfunc(self)
  return myfunc(self) * 2
end

myTable = {
  x = 1,
  y = 2,
  myfunc = myfunc,
  moreMyfunc = moreMyfunc,
}

关于lua - Lua中表成员函数在哪里定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54807946/

相关文章:

javascript - MediaWiki 上的用户自定义 JavaScript 可以调用 Lua 模块吗?

csv - Lua - 将表格转换为逗号分隔的列表

c++ - 如何使用重新定义的打印功能打印 Lua 表?

c++ - 如何编写可以与操作系统交互的VLC插件

lua - Pandoc Lua 过滤器 : how to specify attributes for Span element

delphi - 是否可以将Lua集成到Delphi并在Windows Phone上运行

insert - Lua - table.insert 不起作用

lua - lua表中最大条目数

object - 在 Lua 中,如何找出存储对象的键?

memory-management - 有没有(简单的)方法来获取 Lua 表的内存使用情况?