原文作者: John Labenski; 翻譯:劉貴學(liuguixue@gmail.com)
- 為何選擇 wxLua?
- wxLua, wxPython, wxSomethingElse哪個最好?
- 能將wxlua嵌入我的C++應用程式中作為指令碼解析器嗎?
- 如何學習wxLua
- 閱讀 wxLua 文檔
- 閱讀C++ wxWidgets 文檔
- 運行並跟蹤範例程式碼
- wxLua編程
- wxStrings?
- wxArrayString 與 wxSortedArrayString?
- wxArrayInt?
- 什麼時候 刪除對象,如何刪除?
- 為何在樣本中使用main()函數? 它在wxLua有什麼特別嗎?
- 在類的成員函數調用時,為何額外參數常出現錯誤?
- 為何選擇 wxLua?
- wxLua與wxPython選擇哪一個?
- 這取決於: wxPython 比wxLua 應用支援更廣泛,更棒,那是因為它提供了更多的Python標準庫.
- 反過來講,wxLua是非常小,大小隻有 wxWidgets庫加上大約100KBLua庫,在加上500多KB的wxLua庫。
- wxLua 可以很簡單的與C++ 結合,成為很強大的擴充語言,這也是它的設計意圖。
- 總之,如果你在一個應用程式中使用指令碼語言,你需要Python提供的功能,而在wxlua中還沒有提供,那您應當使用wxPython(功能面選擇wxPython);
相反,如果您在編寫應用程式中考慮的是更小的開銷,或者只是擴充你的C++應用程式,請選擇wxLua. (開銷小,擴充性好,選擇wxLua)
- 能將wxlua嵌入我的C++應用程式中作為指令碼解析器嗎?
- 可以!wxLua的首頁有詳細解釋。
- 這是wxLua的優點之一,使用輕量且快速的解譯器來擴充您的應用程式,讓使用者可以客制化。
- 在單個程式中,您願意建立多少wxLua解譯器都可以。
- 因為Lua語言簡單, 屬於函數式程式設計語言,用它編程更有趣 .(譯者注: 這裡的fun一語雙關, 代表函數式編程也指有趣、有意思。)
- 它看起來與大家熟悉的BASIC或C類似。
- Lua代碼可讀性非常高,與BASIC或C沒有大的變化,幾乎沒有那些特殊的符號,陷阱,或古怪結構。
- 大小 : Lua解譯器本身才只有大約100KB,加上wxWidgets也只有 幾Mb而已.
- 速度 : Lua 幾乎是所有解釋型語言中最快的,看這篇 《偉大語言的決戰》
- 關於為何使用Lua的其他內容, 請參考:http://www.lua.org/about.html
- 如何學習wxLua
- 閱讀 wxLua 文檔
- wxlua.html是wxLua的手冊,主要介紹Lua語言,wxWidget如何在Lua中實現,以及如何使用。
- wxluaref.html是自動產生的,可以當做一份參考手冊,它包括wxLua對wxWidgets的封裝說明,以及與 C++
wxWidgets相比一些使用差異的說明。
- binding.html 描述了如何綁定一個用C/C++實現的庫,但是那些只會寫Lua 代碼的人也應該閱讀這份文檔,便於理解 wxluaref.html文檔。
- 閱讀C++ wxWidgets 文檔
- wxLua與wxWidgets匹配的很好,也就是說wxWidgets裡的函數及參數的描述也適用於wxLua。
看看wxluaref.html文檔去驗證一下,所有不一致的行為都已被清晰的標記出來。
- 看一下wxWidgets wiki頁面中例子,如何入門,以及其他的有用資訊。
- 閱讀 wxPython文檔及Wiki頁面時需要注意: wxLua一些符合比wxPython更象C++。
- 運行並跟蹤範例程式碼
- 範例程式碼將儘可能的展示各種類的使用方法。
- unittest.wx.lua 用於wxlua是否運行正常,但它也提供了豐富的資訊:
哪些函數允許調用;如何強制類型轉換; 如何使用虛函數;以及如何匯出函數。
- binding.wx.lua 遍曆在wxLua中使用到的所有C的結構體,非常值得花時間瀏覽一下,看看它們是如何組合在一起的。
- wxLua編程
- wxStrings?
- wxLua也能使用Lua string,所以所有使用wxString的函數 也同樣可以使用Lua string.
- 但如果確實需要,也可使用wxString。
- wxArrayString 與 wxSortedArrayString?
- 所有可以使用wxArrayString或wxSortedArrayString的函數也同樣可以使用已數字為索引的string表.
- 所有返回wxArrayStrings 或 wxSortedArrayStrings的函數,如果沒有在wxluaref.html裡特殊說明,也可使用一個wxArrayString 或 wxSortedArrayString代替。
- wxArrayInt?
- 所有可以接收wxArrayInt的函數,也同樣可以接收一個以數字為索引的數字表(表的索引為數字,內容也是數字)。
- 所有傳回值為wxArrayInts類型的函數,如果沒有在wxluaref.html裡特殊說明,也可以使用一個wxArrayInt代替。
- 什麼時候 刪除對象,如何刪除?
- 您應當閱讀 wxlua.html手冊中的"C++ Classes CLASS_NAME" 與 "Programming in wxLua"章節。
- 簡單的說,您建立的所有圖形處理相關的對象,在用完後,都應該立即被刪除。
函數的參數為"const wxPen& pen" 或wxObject派生對象時,它們是引用的拷貝而非指標,所以應當刪除。
- 使用函數 "table = wxlua.GetGCUserdataInfo()" 來擷取一個table時,此table不需要被手動刪除,記憶體回收機制會處理。
- 類對象在聲明中 (參考wxluaref.html)會含有%delete標誌,意思是,該對象將由記憶體回收機制自動處理,或wxLua添加刪除函數處理。
當然,將帶 %ungc標記的參數傳給有%delete標誌的對象函數,會發生異常。%ungc標記的意思是對象還會被使用,在wxLua裡不要使用GC刪除。
- 底線——只有以下情況需要考慮手動刪除:
- 圖形處理對象 (特別是MSW );
- 特殊指出的一些類(參考 wxluaref.html),應當考慮手動刪除,因為記憶體回收機制不能及時刪除;
- 非常龐大的對象,例如wxImage(1000,1000);1000).
- 為何在樣本中使用main()函數? 它在wxLua有什麼特殊含義嗎?
- main()函數只是一個通用的程式入口名稱,沒有特殊的意義。
- 我們通常將程式的初始化代碼用一個函數來封裝,這樣做很好,很有用。因為,您應當使用局部變數,而不要用臨時資料汙染全域表。
- 總之,在調試的時,您可以在任何地方只需要加入"do return end",便可插入初始化代碼。而不是使用大量的
"if false then ... end".
代碼。
- 在類的成員函數調用時,為何額外參數常出現錯誤?
- 因為使用':'調用成員函數時,會將 'self'作為第一個參數傳入。
- s = wx.wxSize(1, 2); s:Set(3, 4)
與 s.Set(s, 3, 4)效果一樣, 且第一個參數必須是對象本身,因此
s.Set(s,"hello", 4) 或者r s:Set("hello", 4)
都會拋出一個錯誤:第二個參數不是數字。
- 不幸的是,根本不可能去告訴使用者應該使用 '.' 還是 ':' 來調用函數,因為錯誤資訊可能專門為了區別靜態、非靜態成員函數而定製。
只要記住一點,在使用 ':'調用時,非靜態成員函數的第一個參數為'self'。