gpt4 book ai didi

lua - 如何使 Lua 对象中的类表成员不同?

转载 作者:行者123 更新时间:2023-12-05 07:48:21 32 4
gpt4 key购买 nike

考虑以下代码:

#!/usr/bin/lua

local field =
{
name = '',
array = {},

new = function(self, o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end,
}

local fld1 = field:new()
local fld2 = field:new()

fld1.name = 'hello'
table.insert(fld1.array, 1)
table.insert(fld1.array, 2)
table.insert(fld1.array, 3)

fld2.name = 'me'
table.insert(fld2.array, 4)
table.insert(fld2.array, 5)

print('fld1: name='..fld1.name..' len='..#fld1.array)
print('fld2: name='..fld2.name..' len='..#fld2.array)

执行时输出如下:

fld1: name=hello len=5
fld2: name=me len=5

从输出可以看出namefld1fld2中有不同的值。但是,arrayfld1fld2 中具有相同的值(fld1.arrayfld2。 array 是相同的,因此具有相同的长度 5)。

如何修复此代码,使 fld1.array 独立于 fld2.array(这样修改 fld1.array 就不会更改 fld2.array)?

最佳答案

首先,fld1fld2 具有不同的名称,因为您给了它们不同的名称 - 它们自己的属性。

当您执行表键分配时,新键和值将直接存储在您指定的表中。 __index 元方法仅在您执行表键查找并且未在表中找到该键时才会发挥作用。

一个简单的例子,我们可以看到表键分配将 遮蔽 __index 查找链中的键。

local Foo = { shared = 'shared', private = 'private' }
Foo.__index = Foo

local foo = setmetatable({}, Foo)

foo.private = 'a shadowed value'

print(Foo.shared, foo.shared) -- shared shared
print(Foo.private, foo.private) -- private a shadowed value

注意:有一个 __newindex 元方法用于捕获涉及从未见过的键的表键分配。

考虑将 new 方法更像传统的构造函数,其中您将“私有(private)”属性分配给新创建的实例

local Field = {
-- shared properties go here
}

-- shared methods are defined as such

function Field:new (name)
local o = {
-- private properties for the newly created object go here
name = name or '',
array = {}
}

self.__index = self

return setmetatable(o, self)
end

function Field:insert (value)
table.insert(self.array, value)
end

local fld1 = Field:new('hello')
local fld2 = Field:new('me')

fld1:insert(1)
fld1:insert(2)
fld1:insert(3)

fld2:insert(4)
fld2:insert(5)

print('fld1: name='..fld1.name..' len='..#fld1.array) -- fld1: name=hello len=3
print('fld2: name='..fld2.name..' len='..#fld2.array) -- fld2: name=me len=2

一些注意事项:

  • 通常,“类”名称应采用 PascalCase 格式,以区别它们。
  • 在查找链中有一个:new 函数意味着实例 可以调用它,这可能是可取的,也可能不是可取的。 (可以通过这种方式创建稍微丑陋的继承。)
  • 使用隐式 self 定义方法的方式有所不同。你应该给Chapter 16 of Programming in Lua一读。如果您使用的是 5.2 或 5.3,它可能有点过时,但它应该仍然包含很多有用的信息。
  • 如果您对此感兴趣,我最近写了一个小型图书馆 Base .如果环顾四周,您会发现许多小的 OOP 包可以使这些事情变得更容易一些。

关于lua - 如何使 Lua 对象中的类表成员不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765129/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com