2013-01-24 15 views
3

我讀這從手動http://lua-users.org/wiki/GotoStatement爲什麼Lua禁止轉到本地var定義?

我有一個循環類似的代碼塊:

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只有x = 1(在全球範圍內)它可以工作精細。

這是缺失的疏忽還是優化?例如。也許他們總是認爲在跳轉到標籤後可能會使用本地變種

+1

您可以隨時使用'do'塊,以限制當地的範圍,如果它真的不需要再使用其中的標籤。 –

+0

你能用代碼示例說明嗎? – Steve

回答

7

我不太確定當地人是如何註冊的,但它們是通過數字索引引用的。據推測,如果有人使用goto來跳過本地定義,那麼本地永遠不會被創建,因此任何試圖在標籤後訪問本地的人都會嘗試使用無效索引。

你說得對,從理論上講,如果地方從來沒有用在標籤後面,那麼它不一定要防止跳躍,但實際上,一個盧阿地方存在直到其範圍的結束,而不是在上次使用後死去。任何類型的動態代碼執行都要求這是真實的。

但是,您可以使用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 
+0

這是一個整潔的把戲!謝謝 - 我收集lua 5.3這可以優化 - 我發現的另一個解決方法是,只需在goto標籤前聲明我的本地並將其設置爲本地x = 0或其他任何 – Steve

+0

或者只是'local x',它將默認爲' nil'。無論如何,Lua 5.1在2006年推出,在2011年推出5.2。所以不要屏住呼吸等待Lua 5.3;) –

+2

@Steve:「*我爲lua 5.3收集這可以優化*」我會反對這樣的事情。 Lua要求在任何時間範圍內都可以訪問本地。範圍在塊的結尾處結束。因此,您所擁有的是一段時間內代碼可能合法的情況,然後有人試圖在標籤後面訪問本地。這突然使代碼無效。這不是一件好事。 –

相關問題