2

私は次のようなことをするのがとても便利だと思いました:

if not variable then
    variable = value
end

もちろん、私は通常、変数がローカルであることを望んでいますが、ifでローカルとして宣言することはできません。そうしないと、アクセスできなくなります。

だから時々私はします:

local variable
if not variable then
    variable = value
end

問題は、このコードを反復処理すると、変数宣言によって変数がnilに設定されることです。グローバル値を使用できる場合(可能)、ifブロックの外側で変数を宣言しないことで回避できます。

しかし、私が自分のローカルな価値を持ち、それがその価値を維持できるようにする方法はありませんか?

4

2 に答える 2

7

まず、Luaで定義されている方法は、完全orに回避するための優れたイディオムを提供します。if

variable = variable or value

変数がnil、の場合or、2番目のオペランドに評価されます。もちろん、これはfalse、が有効な値でない場合にのみ機能しますvariable(これは、に関する限りfalsenil両方とも「false」であるためですor)。

ただし、変数をどこかで宣言する必要があるという問題がまだあります。あなたの問題は、グローバルループの場合、次のいずれかを実行する必要があると考えることだと思います。

while condition do
    variable = variable or value
    process(variable)
end

variableグローバルになります)または

while condition do
    local variable
    variable = variable or value
    process(variable)
end

localスコープを1回の反復に制限し、variable`nilとして再初期化するため、これは無意味です。

ただし、できることlocalは、変数のスコープを制限するが他には何もしない別のブロックを作成することです。

do
    local variable
    while condition do
        variable = variable or value
        process(variable)
    end
end
于 2013-03-25T09:16:54.237 に答える
0

ループ内のローカルのスコープをテストする簡単な方法があります。

local a = "this is external a"
for x = 1, 3 do
    print(a)
    local a = "THIS IS INTERNAL a"
    print(a)
end

これを実行すると、次のようになります。

this is external a
THIS IS INTERNAL a
this is external a
THIS IS INTERNAL a
this is external a
THIS IS INTERNAL a

ループ内のローカルaが次の反復まで存続した場合、最初の印刷後、内部aが外部aをシャドウするため、「これは内部a」のみを印刷する必要があります。2つの文字列が交互になっているということは、内部ローカルがループの最下部を生き残ることがないことを意味します。

もちろん、それが生き残ったとしても、ループを通過するたびに、内部ローカル宣言が前の反復のローカルをシャドウイングするという問題が発生します。基本的に、前のイテレーションのバージョンのaにアクセスできなくなり、3回目のイテレーションまでに、3つの個別の内部ローカルが作成され、最後のバージョンのみにアクセスできるようになります。これを行った場合と同じになります。

local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
于 2016-08-03T10:44:34.267 に答える