Function 仅为LUA中的特定实例覆盖函数

Function 仅为LUA中的特定实例覆盖函数,function,object,lua,overriding,overwrite,Function,Object,Lua,Overriding,Overwrite,我基本上没有寻找如何做某事的答案,但我找到了如何做,但我想知道更多的信息。希望这种问题在这里可以。 因为我刚刚发现这是我正在修改的游戏代码,所以我不知道我应该用谷歌搜索什么 在Lua中,我可以有例如: Account = {balance = 0} function Account.withdraw (v) self.balance = self.balance - v end 我可以(在另一个lua文件中) 。。。。 --在某个函数中的某个位置,使用帐户实例: 撤回 ` 这个“技术

我基本上没有寻找如何做某事的答案,但我找到了如何做,但我想知道更多的信息。希望这种问题在这里可以。 因为我刚刚发现这是我正在修改的游戏代码,所以我不知道我应该用谷歌搜索什么

在Lua中,我可以有例如:

Account = {balance = 0}
function Account.withdraw (v)
     self.balance = self.balance - v
end
我可以(在另一个lua文件中)

。。。。 --在某个函数中的某个位置,使用帐户实例: 撤回 `

这个“技术”的名称是什么,这样我就可以找到关于它的更多信息(可能的陷阱、性能考虑与重写/覆盖等)?注意,我只为特定实例(a1)更改了
draw
,而不是为每个帐户实例

额外的问题:还有其他的oo编程语言有这样的功能吗

谢谢你在卢阿 首先,应该指出Lua没有实现面向对象编程;它没有对象、类、继承等概念

如果你想在Lua中实现OOP,你必须自己实现它。通常这是通过创建一个充当“类”的表来完成的,存储“实例方法”,这些方法实际上只是接受实例作为其第一个参数的函数

然后,通过让“构造函数”(也只是一个函数)创建一个新表,并将其元表设置为一个带有指向类表的
\u索引的字段,从而实现继承。当使用“实例”没有的键为其编制索引时,它将在类中搜索该键

换句话说,一个“实例”表可能根本没有函数,但是使用例如
“draw”
对其进行索引只会尝试对类进行索引

现在,如果我们使用一个“实例”表并向其添加一个
draw
字段,Lua将看到它有这个字段,而不必在类中查找它。您可以说,该值与class表中的值有阴影

这种“技术”叫什么名字 它实际上没有一个,但您肯定应该研究元表

在支持这类功能的语言中,比如Ruby(见下文),这通常是通过单例类实现的,这意味着它们只有一个实例

性能注意事项 索引表(包括元表)需要一些时间。如果Lua在实例表中找到一个方法,那么这是一个单表查找;如果没有,则需要首先获取元表和索引,如果没有,并且有自己的元表,则链会继续这样

换句话说,这实际上更快。它确实占用了更多的空间,但实际上并没有那么多(从技术上讲,它可能会占用很多空间,但你真的不应该为此担心。尽管如此,如果你愿意的话)

有没有其他具有这种功能的oo编程语言? 是的,有很多。Ruby是一个很好的例子,你可以做一些类似的事情

array1 = [1, 2, 3]
array2 = [4, 5, 6]

def array1.foo
  puts 'bar'
end

array1.foo # prints 'bar'
array2.foo # raises `NoMethodError`

我知道你在Lua中关于OO的考虑,但也谢谢你。当你说它没有名字时,你的意思是在Lua中没有名字,甚至在Rubi中也没有名字,我觉得即使foo是一个方法,重写也不合适?我的实际OO体验是Java。@LucianHada重写是一个很好的描述,我会用谷歌搜索它,但它没有它的名字那么多。正如我所说的,单例类在“真正的”OOP中是一个相关的概念,但是Lua使用了一种类似于原型的方法,在这种方法中,类和对象之间的界限实际上只在程序员的头脑中。在某种程度上,每个对象都是它自己的一个子类,所以这大体上属于“子类型”,尽管这是一种非常不方便的思考方式。在这一点上,我看不到单例和它之间的联系,但可能是我的错,我将进一步研究它。可能有a1、a2等由引擎创建的Account实例(是的,我正在修改的游戏是在Lua上实现OOP的),然后我带着我的mod进入图片,访问一个或多个这样的实例,并以这种方式“覆盖”其中一个方法(不影响其他实例)我的困境(性能、陷阱等)实际上是如果在条件变为真时在“对象”上使用此技术,然后在条件变为假时恢复到原始函数/方法,而不是更经典的重写“类方法”的方法,并在我的实现中检查条件(如果条件=假则调用原始函数)获取原始方法,使用您的条件创建一个新函数并存储它(因此它只关闭一次),然后将其添加到您要覆盖的实例中,并保持不变。这应该是最可靠的方法。
array1 = [1, 2, 3]
array2 = [4, 5, 6]

def array1.foo
  puts 'bar'
end

array1.foo # prints 'bar'
array2.foo # raises `NoMethodError`