为什么我的表格返回NIL,而不是填充?

我是Lua的新手,正在尝试理解Lua中的OOP概念。为此,我尝试创建一个对象并创建方法和"私有变量"。 我的问题在于当我尝试使用"setter"或"getter"时,它指示我的表格返回NIL,这意味着我要么有一个范围问题,要么有其他我无法解决的问题。

问题在于我正在使用一个在线Lua编码教程的示例,当我运行教程时,它可以无缺陷地运行。然而,当我运行我的程序时,每当我尝试从一个成员函数中“获取”或返回一个值时,我都会得到NIL或没有输出。

我使用了几个不同的环境:

  • ZeroBrain
  • Sublime Text
  • Lua for Windows

你知道为什么我的代码没有返回填充的表格吗?

newPlayer = function(n, h, a, r)

  player = {}

  n = n or ""
  h = h or 100
  a = a or 100
  r = r or 0

  function player:getPlayerName()
    return n
  end

  function player:getPlayerHealth()
    return h
  end

  function player:getPlayerArmor()
    return a
  end

  function player:getPlayerRank()
    return r
  end

  function player:setPlayerName(arg)
    n = arg
  end

  function player:setPlayerHealth(arg)
    h = arg
  end

  function player:setPlayerArmor(arg)
    a = arg
  end

  function player:setPlayerRank(arg)
    r = arg
  end

  function player:connect(arg)
    print(string.format(" %s joined" , arg))
    end

  return player

end

player1 = newPlayer("John", 100, 100, 1000)
player1.getPlayerName()
点赞
用户369792
用户369792

TLDR 尼古拉的回答,参见我的回答到另一个问题:

  function player:setPlayerArmor(arg)
    a = arg
  end

:语法是语法糖。当声明和使用时,它会创建一个隐式的 self 参数。如果您以不同的方式声明和使用它,参数不会是您期望的。假设您的玩家有100点生命值。看看这个结果:

player1.setPlayerHealth(55, 66)
print(player1.getPlayerHealth())
-- 因为 `:` 声明了隐式的 'self' 参数,所以将显示 '66' 而不是 '55'

这个结果会显示66,因为 setPlayerHealth 函数有一个隐式的 'self' 参数,因为它是用 : 声明的。如果您改为使用 :

player1:setPlayerHealth(55, 66)
print(player1:getPlayerHealth())
-- 因为 `:` 把 player1 作为 self 传递,所以将显示 '55'
function player:setHealth1(arg)
  -- 隐式的 'self' 参数在调用 player1 时指向 player1
end

-- 相当于
function player.setHealth2(self, arg)
  -- 用 `.` 符号,你需要显式的添加 'self' 参数
end

player1.setHealth1(31) -- self 参数为 31,arg 参数为 nil
player1.setHealth2(32) -- self 参数为 32,arg 参数为 nil
player1:setHealth1(33) -- self 参数为 player1,arg 参数为 33
player1:setHealth2(34) -- self 参数为 player1,arg 参数为 34
2020-04-23 15:20:18