为什么这个Lua函数不能使用自己的“:”标记为“local”而不会得到“'('期望'附近':'”

时间:2012-05-15 04:26:34

标签: lua corona

为什么这个Lua函数不能使用自己的“:”标记为“local”而不会得到:

  

'('预计在'附近':'

也就是说,在下面的代码中工作。但是为什么我不能将“scene:createScene”函数设置为本地(因为我在尝试时得到了上述错误)。

我注意到侦听器功能需要在本地进行,我在故事板中偶尔会遇到跨场景问题。这些可以标记为本地和工作正常。

SceneBase = {}
function SceneBase:new()
  local scene = Storyboard.newScene()

  local function returnButtonTouch_Listener (event)
    -- code here
  end

  function scene:createScene( event )   -- WHY CAN'T THIS BE LOCAL???
    -- code here
  end

  return scene
end
return SceneBase

这就是为什么函数行不能读取:

  local function scene:createScene( event )

1 个答案:

答案 0 :(得分:13)

function scene:createScene(event) ... end

是语法糖:

scene.createScene = function(self, event) ... end

这是语法糖:

scene["createScene"] = function(self, event) ... end

你想这样做:

local scene["createScene"] = function(self, event) ... end

这没有任何意义。


另一种放置方式:local是变量的限定符,它使其成为局部而非全局变量。您将使用local function scene:createScene( event )符合哪个变量?

createScene不是变量,它是表scene中的一个键。


实际上,这有点误导。当你说:

foo = 10

没有资格,foo变为全局,也就是说它存储在这样的全局状态:

_G.foo = 10;

当然这意味着同样的事情:

_G["foo"] = 10;

当您使用关键字local时,它不会存储在表中,而是最终存储在VM寄存器中,这会更快并且范围更加严格。

当您写下其中任何一个时:

function foo.bar() end
function foo:bar() end

显式地将函数值存储在表foo)中。这些陈述分别与这些陈述完全相同:

foo["bar"] = function() end
foo["bar"] = function(self) end

  

我注意到需要将侦听器功能设为本地

你是什么意思?在Lua中,函数是函数是函数。它只是另一个值,如字符串或数字。它是存储在全局,表格,本地还是不存储都是无关紧要的。

local foo = print
_G["zap"] = foo
doh = zap
t = { zip = doh }
t.zip("Hello, World") -- Hello, World

assert(print == foo
    and zap == foo
    and zap == doh
    and t.zip == doh)

这里我们传递print函数。它具有相同的功能,只要我们引用它,我们就可以调用它。

我不知道Corona,但我猜测事件处理程序没有通过命名本地人的约定来指定。您需要将其注册为事件处理程序。例如,根据this video,Button对象有一个onEvent字段,该字段设置为该按钮的处理程序。