5

为什么这个使用自我“:”的Lua函数不能被标记为“本地”而不得到:

'(' 预计在 ':' 附近

也就是说,在下面的代码中一切正常。但是为什么我不能将“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 )
4

1 回答 1

14
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,但我猜事件处理程序不是由当地人的命名约定指定的。您需要将其注册为事件处理程序。例如,根据此视频,Button 对象有一个onEvent字段,该字段设置为该按钮的处理程序。

于 2012-05-15T04:31:03.990 回答