LUA尝试索引全局nil值

时间:2018-09-25 14:42:07

标签: lua

我读了其他标题相同但无济于事的答案。我的问题看起来很简单,但是我找不到解决方法。几天前才刚开始LUA。在这里,它打印“ nam”,所以有冲突。但是,display.remove(apple)不起作用。并且removeSelf()给出一个错误,指出“试图索引全局'apple'(nil值)”。我唯一想在碰撞时发生的事情就是让苹果消失。

function appleCollision(self, event)
  if event.phase == "began" then
    print("nam")
    --display.remove( apple )
    apple:removeSelf()
    apple = nil
  end
end


local apple = display.newImageRect( "apple.png", 65, 85 )
apple.x, apple.y = 460, -100
apple.rotation = 15
apple:addEventListener ( "collision", apple )
apple.collision = appleCollision
physics.addBody( apple, { density=1.0, friction=0.3, bounce=0.3 } )

1 个答案:

答案 0 :(得分:1)

我想这将是一个多方面的答案...

词汇范围

典型示例:

do
  local foo = 20
  function bar() return foo end
end
print(tostring(foo)) -- prints "nil", foo is out of scope
print(bar()) -- prints 20, bar still knows about foo

在您的情况下,反之亦然

function bar() return foo end
-- foo does not exist as a local yet, so Lua tries accessing a global foo
do
  local foo = 20
  print(tostring(bar())) -- prints nil because bar doesn't know foo
end -- forget about local foo
foo = 30 -- global
local foo = 20
print(bar()) -- prints 30, because it doesn't know the local foo

您的问题

基本上就是您的示例中发生的情况。您在函数后声明player变量,因此在声明该函数时,不存在局部变量player,因此它将编译访问全局player变量的函数。由于该全局不存在,因此将其视为nil,并且当您尝试对其进行索引时,Lua会抱怨。

修复

  • 要么删除local,然后将player设置为全局变量(容易做到,但是全局变量是魔鬼,您不应轻易使用它们)
  • 或仅在函数上方local player进行声明,然后可以在其下方分配一个值。

请注意,该函数将在创建函数时保存变量,而不是其值。这是我的意思的示例:

local foo = 20
function bar() return foo end
foo = 30
print(bar()) -- prints 30, not 20

还有更多的功能,但这是解决问题所需要了解的所有知识。如果您想了解更多信息,只需在google上搜索lua的词汇范围,您肯定会找到比我所能提供的更好的解释。