请考虑以下代码:
public override int GetHashCode(Option obj)
{
return obj.OptionEntry.GetHashCode();
}
执行时的输出如下:
#!/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
在name
和fld1
中的值不同。但是,fld2
在array
和fld1
中具有相同的值(fld2
和fld1.array
相同,因此长度相同,为5。 / p>
如何修复此代码,以使fld2.array
独立于fld1.array
(以便修改fld2.array
不会更改fld1.array
)?
答案 0 :(得分:1)
首先,http://
和fld1
有不同的名称,因为您给了他们不同的名字 - 他们自己的属性。
执行表键分配时,新键和值将直接存储在您指定的表中。当您执行表键查找并且表中找不到键时,fld2
元方法才会播放。
一个快速示例,我们可以看到表键分配将__index
查找链中的 shadow 键。
__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
metame方法用于捕获表密钥分配,其中包含一个前所未见的密钥。
考虑将__newindex
方法更像传统的构造函数,其中您指定私有'新创建的实例的属性。
new
更多说明:
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
函数意味着实例可以调用它,这可能是也可能不是。 (可以用这种方式创建稍微丑陋的继承。):new
的方法之间存在差异。你应该给Chapter 16 of Programming in Lua一个读数。如果您使用5.2或5.3,它可能有点过时,但它仍然应该有很多有用的信息。答案 1 :(得分:-1)
Lua的oop技术与c ++,java
不同__ index metamethod参考目标表记录。
等等,fld1,fld2数组项是Field的数组项。
你必须制作一张新表并使用它。
为什么名称的价值不同。因为,您指定了一个名称
fld1.name ='hello'
简单的代码修复
fld1.array = {}
使用新方法代码修复
local o1 = {name = '', array = {}}
local o2 = {name = '', array = {}}
local fld1 = field:new(o1)
local fld2 = field:new(o2)
制作新表格(制作o)并插入新方法。