6

マニュアルhttp://lua-users.org/wiki/GotoStatementからこれを読みました

ループ内に同様のコードブロックがあります:

while true do
  if someCond == nil then
      goto f  -- invalid (forward jump into scope of local definition)
  end

  local x = 1
   -- do something with x
  ::f::
end

これは「...ローカルxのスコープにジャンプする」で失敗します

しかし、なぜ?ローカルxを使用した後にジャンプが実行された場合(もう触れられていない)、したがって、ここでは「ローカルx」はもう必要ありません。

x = 1(グローバルで作成)だけでローカルxを切り替えると、正常に機能します。

それは見落としですか、それとも最適化が欠けていますか?たとえば、ラベルにジャンプした後、ローカル変数を使用できると常に想定している可能性があります

4

1 に答える 1

11

ローカルがどのように登録されているかはよくわかりませんが、数値インデックスを介して参照されています。おそらく、を使用しgotoてローカル定義をスキップした場合、ローカルは作成されないため、ラベルの後にローカルにアクセスしようとすると、無効なインデックスを使用しようとします。

理論的には、ローカルがラベルの後に使用されない場合、必ずしもジャンプを防ぐ必要はありませんが、実際には、luaローカルは、最後の後に死ぬのではなく、スコープの最後まで存在します利用方法。あらゆる種類の動的コード実行では、これが真である必要があります。

ただし、do-blockを使用して、ローカルの範囲を制限することができます。あなたのコードで、あなたはこれを次のように書き直します

while true do
  if someCond == nil then
      goto f
  end

  do
      local x = 1
       -- do something with x
  end -- x is now gone
  ::f::
end
于 2013-01-24T23:53:33.970 に答える