2013-06-06 19 views
5

私はLuaを学習していて、同じ名前の2つのローカル変数を参照できるかどうかは疑問でした。Lua - 同じ名前の2つのローカル変数

たとえば、次のコードセグメントでは、構文は合法(undefined behaviorなし)ですか?

私は実行しているので質問しますが、舞台裏で何が起こっているのかわかりません。これは単に同じxを参照していますか?あるいは、2つのlocal x変数が現れて、事態を混乱させます。私はここで何が起こっているのか、なぜそれが正しいのかを知りたい。

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

print("x = " .. x); -- x = 1 

答えて

7

2つの変数があります。 2番目のシャドウは、最初のシャドウ(削除または上書きはしません)。

クロージャを使用して以前の定義にアクセスすることもできます。

local x = 5 + 3 
local function getX1() 
    return x 
end 
local x = 3 - 2 
local function getX2() 
    return x 
end 

print("x = " .. x); -- x = 1 
print("x = " .. getX1()); -- x = 8 
print("x = " .. getX2()); -- x = 1 
+0

:-) Luaのことで覚えてきました。面白いと知って良い!ありがとう! – MrHappyAsthma

4

はい、合法です。 Luaはlocal -variable宣言をstatementsとして扱います。地元のステートメントを実行するたびに新しいローカル変数を定義すること

お知らせ:

はここLua Reference Manualから興味深い例です。次の例を考える:

a = {} 
local x = 20 
for i=1,10 do 
    local y = 0 
    a[i] = function() y=y+1; return x+y end 
end 

ループ10のクロージャ(すなわち、匿名関数の10のインスタンスである)を作成します。これらのクロージャーはそれぞれ異なるy変数を使用しますが、すべて同じxを共有します。

この例では、戻る閉鎖部分を無視すると、同じforブロックにyという名前の変数があります。

8

あなたのすべてのローカル変数は、非常に明確な例

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

local i = 0 
repeat 
    i = i + 1 
    local name, value = debug.getlocal(1, i) 
    if name == 'x' then 
     print(name..' = '..value) 
    end 
until not name 
+0

結果はLuaで見ることができます –

関連する問題