5

他にも同様のトピックがあることは承知していますが、私の質問に対する明確な答えが見つかりませんでした。

次のような関数があるとします。

function aFunction()
  local aLuaTable = {}
  if (something) then
     aLuaTable = {}
  end
end

if ステートメント内の aLuaTable 変数については、まだローカルですよね? 基本的に私が求めているのは、変数を初めてローカルとして定義し、それを何度も何度も使用すると、プログラムの残りの期間はローカルのままになります.これはどのように正確に機能しますか?.

さらに、Lua グローバル変数のこの定義を読みました。

定義されたブロックにない変数は、グローバル スコープにあると言われます。グローバル スコープ内のすべてのものは、すべての内部スコープからアクセスできます。

定義されたブロックにないということはどういう意味ですか?私の理解では、変数をどこでも「宣言」すると、常にグローバルになりますが、それは正しくありませんか?.

質問が単純すぎる場合は申し訳ありませんが、Java と Objective-C から来ているので、lua は私にとって非常に奇妙です。

4

2 に答える 2

13

「定義されたブロックにない変数は、グローバルスコープにあると言われています。」

これは単に間違っているので、あなたの混乱は理解できます。ユーザー wiki から取得したようです。修正情報でページを更新しました:

グローバルとして定義されていない変数はすべてlocalグローバルです。

私の理解では、変数をどこでも「宣言」すると、常にグローバルになります

として定義しない場合はlocal、グローバルになります。ただし、local同じ名前で を作成すると、グローバルよりも優先されます (つまり、Lua は変数名を解決しようとするときに最初にローカルを「認識」します)。この投稿の下部にある例を参照してください。

変数を初めてローカルとして定義し、それを何度も何度も使用すると、プログラムの残りの期間はローカルのままになります。これはどのように正確に機能しますか?

コードがコンパイルされると、Lua は定義したローカル変数を追跡し、特定のスコープで使用できるものを認識します。変数を読み書きするときはいつでも、スコープ内にその名前のローカルがあれば、それが使用されます。存在しない場合、読み取り/書き込みは (コンパイル時に) テーブルの読み取り/書き込みに (テーブル _ENV を介して) 変換されます。

local x = 10 -- stored in a VM register (a C array)
y = 20       -- translated to _ENV["y"] = 20

x = 20       -- writes to the VM register associated with x
y = 30       -- translated to _ENV["y"] = 30

print(x)     -- reads from the VM register
print(y)     -- translated to print(_ENV["y"])

ローカルはレキシカルスコープです。他のすべてが入り_ENVます。

x = 999

do -- create a new scope
    local x = 2
    print(x)      -- uses the local x, so we print 2
    x = 3         -- writing to the same local
    print(_ENV.x) -- explicitly reference the global x our local x is hiding
end

print(x) -- 999
于 2012-05-18T17:05:44.817 に答える
4

if ステートメント内の aLuaTable 変数は、まだローカルですよね?

ここであなたがどのように混乱しているのか理解できません。ルールは Java の場合とまったく同じです。変数はまだスコープ内にあるため、存在し続けます。

local変数は、Java で「スタック」変数を定義するのと同じです。変数はそれを定義したブロック スコープ内に存在し、そのブロックが終了すると存在しなくなります。

次の Java コードを検討してください。

public static void main()
{
  if(...)
  {
    int aVar = 5; //aVar exists.
    if(...)
    {
      aVar = 10; //aVar continues to exist.
    }
  }

  aVar = 20; //compile error: aVar stopped existing at the }
}

「グローバル」とは、単にローカルではない変数名です。上記と同等の Lua コードを考えてみましょう。

function MyFuncName()
  if(...) then
    local aVar = 5 --aVar exists and is a local variable.

    if(...) then
      aVar = 10 --Since the most recent declaration of the symbol `aVar` in scope
                --is a `local`, this use of `aVar` refers to the `local` defined above.
    end
  end

  aVar = 20 --The previous `local aVar` is *not in scope*. That scope ended with
            --the above `end`. Therefore, this `aVar` refers to the *global* aVar.
end

Java でコンパイル エラーになるものは、完全に有効な Lua コードですが、おそらく意図したものではありません。

于 2012-05-18T15:17:14.120 に答える