为什么这个使用 self ":" 的 Lua 函数在标记为“local”时会出现“'(' expected near ':'” 的错误?

为什么这个 Lua 函数使用了 self ":" 就无法被标记为“local”,而没有得到:

在“:”附近需要'('

也就是说,在下面的代码中,事情会起作用。但为什么我不能将“scene:createScene”函数定义为本地函数(当我尝试时会出现上述错误)。

我知道监听器函数需要被标记为本地函数,否则在 storyboard 中有时会遇到跨场景问题。这些可以被标记为本地并正常工作。

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

  local function returnButtonTouch_Listener (event)
    -- code here
  end

  function scene:createScene( event )   -- 为什么不能是本地函数???
    -- code here
  end

  return scene
end
return SceneBase

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

  local function scene:createScene( event )

原文链接 https://stackoverflow.com/questions/10594139

点赞
stackoverflow用户501459
stackoverflow用户501459
`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表中的键(key)。


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

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 

我注意到监听器函数需要被 local 声明

你这是什么意思?在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-15 04:31:03