Lua - 多个对象,链接的值?

我最近查了一个简单的Lua面向对象编程(oop)的例子,并稍加修改,如下所示。

我无法理解 elf.name 和 hobbit.name 之间的联系。为什么当我更改其中任何一个的值时,它会影响到另一个?我知道我可以将 elf.name 设置为函数内的局部变量,但它没有产生同样的效果。

相比之下,更改 another.name 的值对其他两个没有影响。 elf.name 和 hobbit.name 之间是否存在持久连接?我以为它们被视为不同的对象。

谢谢。

;^) Zalokin

elf = {}

elf.name = "Frodo"

another = {}

function Character()

  return elf

end

local hobbit = Character()

print ("elf.name set to Frodo")

print("hobbit.name - "..hobbit.name)

print("elf.name - "..elf.name.."\
  ")

hobbit.name = "Charlie"

print ("hobbit.name set to Charlie")

print("hobbit.name - "..hobbit.name)

print("elf.name - "..elf.name.."\
  ")

another.name = "Gary"

print ("hobbit.name set to Charlie and another.name set to Gary")

print("hobbit.name - "..hobbit.name)

print("elf.name - "..elf.name)

print("another.name - "..another.name.."\
  ")

结果:

>>>>elf.name set to Frodo
>>>>hobbit.name - Frodo
>>>>elf.name - Frodo
>>>>
>>>>hobbit.name set to Charlie
>>>>hobbit.name - Charlie
>>>>elf.name - Charlie
>>>>
>>>>hobbit.name set to Charlie and another.name set to Gary
>>>>hobbit.name - Charlie
>>>>elf.name - Charlie
>>>>another.name - Gary
点赞
用户6889435
用户6889435
function Character()

  return elf

end

local hobbit = Character()

你错误的地方就在这里。我相信 Lua 是按引用传递的。这样你的代码就不起作用了。而且,霍比特不应该是精灵的实例 - 如果 Lua 按引用传递,实例将共享数据。此外,在顶部,精灵的名称是弗罗多。建议你把它删除。你只需要像你对 another 对象做的那样操作就可以了。

编辑:Lua 确实是按引用传递的,但只针对表和对象。 引用 Lua 5.1 参考手册:

Lua 中有八种基本类型:nil、boolean、number、string、function、userdata、thread 和 table。

表、函数、线程和(完整的)用户数据值是对象:变量实际上不包含这些值,只有对它们的引用。赋值、参数传递和函数返回总是操作对这些值的引用;这些操作并不意味着任何一种复制。

2017-10-25 15:22:36
用户3574628
用户3574628

任何使用 {},都被称为表构造器。它会创建一个全新的表。当你执行 elf.name = "Frodo",你正修改 elf 指向的表。在你的代码中,elfanother 是分别初始化的。而另一方面,hobbit 是间接地给了指向 elf 的引用。换句话说,elfhobbit 是指向同一张表的引用。

2017-10-25 18:50:00