Lua 继承中包含元方法吗?

我正在 Lua 中尝试实现PIL 16.2中介绍的简单继承。然而,我遇到了一个令人惊讶的行为:元方法似乎不会被继承。在下面的示例中,我创建了一个具有 xy 成员的点类,并赋予它一个 __add 元方法。当对点的实例进行加法运算时,一切正常,但是如果我创建一个子类并对其实例进行相加,就会出现错误。

Point = {}

function Point:new(x, y)
    local point = {}
    setmetatable(point, self)
    self.__index = self
    point.x = x or 0
    point.y = y or 0
    return point
end

Point.__add = function(a, b)
    return Point:new(a.x + b.x, a.y + b.y)
end

p = Point:new(2,2)
r1 = p + p
print(p.x, p.y) -- 正如预期的那样打印 “4 4”

ChildPoint = Point:new()
c = ChildPoint:new()

r2 = c + c -- 错误:尝试对表值进行算术运算(本地“t1”)
print(r.x, r.y)

我原本期望 Lua 会在 ChildPoint 中寻找 __add,并触发 ChildPoint__index,在 Point 中找到 __add。但是这似乎并没有发生。

为什么这样不起作用,实际发生了什么,如果这是正确的行为(而不仅仅是我的错误),我应该如何在 Lua 中实现可继承的元方法?

点赞
用户1442917
用户1442917

正如 Egor 所解释的,这种情况下需要显式地复制元方法;请参见这个早期的 SO问题 来讨论相同的问题和可能的解决方案(选择的方案复制了元方法)。

2016-03-25 23:14:45