Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why can't this Lua function using a self ":" be marked "local" without getting "'(' expected near ':'"

Tags:

lua

coronasdk

Why can't this Lua function using a self ":" be marked "local" without getting:

'(' expected near ':'

That is, in the code below things work. But why can't I make the "scene:createScene" function local (as I get the above-mentioned error when trying).

I note the listener functions need to be made local else I have struck cross-scene issues at times in storyboard. These can be marked local and work fine.

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

That is why can't the function line read:

  local function scene:createScene( event )
like image 318
Greg Avatar asked May 15 '12 04:05

Greg


1 Answers

function scene:createScene(event) ... end

Is syntax sugar for:

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

Which is syntax sugar for:

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

You want to do:

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

Which makes no sense.


Another way of putting it: local is a qualifier for a variable which makes it local rather than global. What variable would you be qualifying with local function scene:createScene( event )?

createScene is not a variable, it's a key in the table scene.


Actually, that's a bit misleading. When you say:

foo = 10

Without qualification, foo becomes global, which is to say it's stored in the global state like this:

_G.foo = 10;

Which of course means the same as this:

_G["foo"] = 10;

When you use the keyword local, it doesn't get stored in a table, it ends up stored in a VM register, which is both faster and has more tightly constrained scope.

When you write either of these:

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

You are explicitly storing the function value in a table (foo). Those statements are exactly equivalent to these, respectively:

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

I note the listener functions need to be made local

What do you mean by that? In Lua, a function is a function is a function. It's just another value, like a string or number. Whether it's stored in a global, table, local, or not stored at all is irrelevant.

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)

Here we pass the print function around. It's all the same function, and as long as we have a reference to it we can call it.

I don't know Corona, but I'm guessing that event handlers are not specified by naming convention of locals. You need to register it as an event handler. For instance, according to this video a Button object has an onEvent field which is set to the handler for that button.

like image 60
Mud Avatar answered Sep 27 '22 18:09

Mud