如何在Lua对象中使类表成员不同?

时间:2016-08-04 10:42:50

标签: lua

请考虑以下代码:

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 namefld1中的值不同。但是,fld2arrayfld1中具有相同的值(fld2fld1.array相同,因此长度相同,为5。 / p>

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

2 个答案:

答案 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

更多说明:

  • 一般来说,' class'名称应该在PascalCase中,以使它们区别开来。
  • 在查找链中使用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,它可能有点过时,但它仍然应该有很多有用的信息。
  • 如果您对一个小型图书馆感兴趣,我最近写了Base。如果你环顾四周,你会发现很多小的OOP包让这些东西变得容易些。

答案 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)并插入方法。