【问题标题】:Lua - Multiple objects, linked values?Lua - 多个对象,链接值?
【发布时间】:2018-04-06 16:47:24
【问题描述】:

我最近查找了一个简单的 Lua oop 原理示例并稍作修改,如下所示。

我觉得难以理解的是 elf.name 和 hobbit.name 之间的联系。为什么当我改变任何一个的值时,它会影响另一个?我知道我可以在函数内将 elf.name 设置为 local,但它不会产生相同的效果。

相比之下,改变 another.name 的值对其他两个没有影响。 elf.name 和 hobbit.name 之间有持久的联系吗?我认为它们被视为单独的对象。

谢谢。

;^) 扎洛金

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

【问题讨论】:

    标签: function oop lua


    【解决方案1】:
    function Character()
    
      return elf
    
    end
    
    local hobbit = Character()
    

    这就是你的错误所在。我相信 lua 是通过引用传递的。这样,您的代码将不起作用。此外,Hobbit 不应该是 Elf 的实例——如果 Lua 是通过引用传递的,那么实例将共享数据是很自然的。此外,在顶部精灵的名字是佛罗多。我建议你删除它。您需要做的就是像使用 another 对象一样执行此操作。

    编辑:Lua 是通过引用传递,但仅在表和对象上。 引用 Lua 5.1 参考手册:

    Lua 中有八种基本类型:nil、boolean、number、string、 函数、用户数据、线程和表。 ....

    表、函数、线程​​和(完整的)用户数据值都是对象:变量实际上并不包含这些值,只有 对他们的引用。赋值、参数传递和函数 返回总是操纵对这些值的引用;这些操作 不暗示任何形式的复制。

    【讨论】:

    • Lua 永远不会通过引用传递:如果我有function f(x) x = {} end,并且我调用f(y),这将永远不会导致我的变量y 设置为{}。 Lua 总是按值传递,但传递的值有时是引用。
    【解决方案2】:

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

    【讨论】:

    • 不,2个变量可以共享同一个对象。
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2016-11-25
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多