5

自己 ":" を使用するこの 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 )
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関数を渡します。それはすべて同じ関数であり、それへの参照がある限り呼び出すことができます。

コロナのことはわかりませんが、ローカルの命名規則でイベントハンドラーが指定されていないのではないかと推測しています。イベントハンドラとして登録する必要があります。たとえば、このビデオによると、Button オブジェクトには、onEventそのボタンのハンドラーに設定されたフィールドがあります。

于 2012-05-15T04:31:03.990 に答える