2016-03-02 6 views
8

私はLuaのドキュメントでコードの奇妙な作品を見つけた:Lua - ローカルに必要なeveytimeローカル変数が割り当てられていますか?

function trim8(s) 
    local i1,i2 = find(s,'^%s*') 
    if i2 >= i1 then s = sub(s,i2+1) end 
    local i1,i2 = find(s,'%s*$') 
    if i2 >= i1 then s = sub(s,1,i1-1) end 
    return s 
end 

はなぜlocali1i2でもう一度使用されていますか?それらはすでにローカル変数の中で宣言されていませんか?割り当てたいたびにlocalキーワードを繰り返す必要がありますか?

答えて

7

いいえ、localを何度も何度も使用する必要はありません。変数i1i2は、最初の行自体のために関数の範囲でlocalになります。

同じ変数を何度も何度も定義するのは間違いありません。スタックの新しい位置を新しいものに割り当て、古いものをシャドーするだけです。

次は、単純な機能のための命令の出力です:

function t() 
    local i = 2 
    local i = 3 
end 
t() 
function <temp.lua:1,4> (3 instructions, 12 bytes at 00658990) 
0 params, 2 slots, 0 upvalues, 2 locals, 2 constants, 0 functions 
     1  [2]  LOADK   0 -1 ; 2 
     2  [3]  LOADK   1 -2 ; 3 
     3  [4]  RETURN   0 1 

だけi = 3に二local i = 3を更新:

function t() 
    local i = 2 
    i = 3 
end 
t() 
function <temp.lua:1,4> (3 instructions, 12 bytes at 00478990) 
0 params, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions 
     1  [2]  LOADK   0 -1 ; 2 
     2  [3]  LOADK   0 -2 ; 3 
     3  [4]  RETURN   0 1 

お知らせ秒で違い命令。


とは別に、この機能は非常に非効率的です。二宣言localかどうかを使用して、

function Trim(sInput) 
    return sInput:match "^%s*(.-)%s*$" 
end 
+2

スタック位置(ローカル変数)は対象ではありませんガベージコレクションへシャドウされたローカル変数に格納された値は、引き続きアクセス可能であるとみなされます。 –

+0

@EgorSkriptunoffこれについての仕様書はありますか、またはそれは観測に基づいていますか? (私は、標準的な実装では、デバッガを書いている間にシャドーされたローカルを見てきたことは知っています。)しかし、コンパイラはスタックの使用を自由に自由にすることはできませんか? –

+0

@TomBlodget - IMOでは、典型的なLuaプログラムではスタックの最適化が役立つことはほとんどありません。 –

5

技術的に等価ではありません。あなたは、代わりに以下を使用することができます。第2のlocalを使用すると、別の変数が宣言されます。

しかし、あなたのコード例では、基本的に同じです。これらの単純なコードチェック:

local a = 0 
local a = 1 

local a = 0 
a = 1 

を使用luac -p -l次の結果を出力します

0+ params, 2 slots, 0 upvalues, 2 locals, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 0 
    2 [2] LOADK  1 -2 ; 1 
    3 [2] RETURN  0 1 

0+ params, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 0 
    2 [2] LOADK  0 -2 ; 1 
    3 [2] RETURN  0 1 
+0

heh、私の返信を 'luac -l'の出力で更新しました= P – hjpotter92

+0

ありがとうございました。したがって、 'a'を2回宣言すると、識別子 'a'によって参照される変数はどれですか? 2番目に宣言されたのは? – Virus721

+0

@ Virus721 2番目の文を宣言する文全体の後に、2番目の文があります。たとえば、 'local a = 0;ローカルa = a + 1 'は第2変数に値0 + 1を割り当てる。 –

関連する問題