表格範圍區塊

lua-users home
Wiki

在 Pascal 中有將記錄中的資料成員放入範圍內的技巧。我提議我們也用類似的方式,使用像這樣的結構

A = {}

using A in
    foo = 5;
    bar = "Hello World";
end

write(A.foo, A.bar) -- Will print out "5Hello World"

執行的基本方法是,在區塊內用表格範圍取代全域範圍。因為這是個區塊,所以可以保證永不會失去全域範圍。

這在 Lua 的物件導向實作中會很有用,可以更善用自己。如果你將自己放在範圍內,它就會更像「C」

function A:foo(x)
    local y
    bar = x -- Sets self.bar to x  [and where comes x from? --ET]
    y = x -- Sets local variable y
    self.y = x -- Sets self.y
end

也許可以完成這個範例,以顯示如何設定標籤

這需要使用標籤函式,其中會在實際函式呼叫周圍加入 using 區塊。

建立 Lua 套件時,這也能派上用場。在 Python 中,如果某個模組使用全域範圍,實際上就是進入模組字典中的變數。稍微處理一下,就能使用「using..in」區塊建立同樣的效果。

還有個問題是,這將如何配合作為假設變數為區域以上建議。


1. 當「using」啟動時,你如何進入全域範圍?在 C++ 或 Pascal 等型別語言中,編譯器知道哪些識別碼是全域或類別/結構成員,並產生適當的程式碼。Lua 卻不知道...

2. 我發現在 C++ 中,你無法查看識別碼是類別成員還是全域,這很令人困擾。你必須查看類別定義。撰寫 self.x 就會清楚表示進入的是欄位,而不是全域。我同意。許多 C++ 程式設計師甚至使用慣例,將所有成員變數都以 m_ 開頭,清楚表示使用時進入的是成員變數。--PeterPrade

--ET


可以使用以下方式進行第一個範例

tab = { tab2={ x=3 } }
do local t = tab.tab2
  print (t.x)
  t.x = 4
end

print (t) -- nil as out of scope now

--NDT


最新變更 · 喜好設定
編輯 · 歷程記錄
最近編輯時間為 2007 年 7 月 7 日下午 8:22 GMT (diff)