在Lua中定义表成员函数的位置

问题描述 投票:2回答:1

据我了解,有多种方法可以在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()语法和冒号)不可用呢?

lua lua-table
1个回答
2
投票

作为函数式编程书呆子,我更喜欢方法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提出了另一个重点(如果表是一个类,则更相关):

方法a允许您从函数内部访问变量table1作为upvalue。方法b不允许这样做。

在这种情况下,我会转发声明表名。这具有更改变量一次的优点,而不是多次改变表。

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,
}
© www.soinside.com 2019 - 2024. All rights reserved.