wxLua 2.8.10 - FAQ

原文作者: John Labenski; 翻譯:劉貴學([email protected])

  1. 爲何選擇 wxLua?
    1. wxLua, wxPython, wxSomethingElse哪個最好?
    2. 能將wxlua嵌入我的C++應用程序中作爲腳本解析器嗎?
  2. 如何學習wxLua
    1. 閱讀 wxLua 文檔
    2. 閱讀C++ wxWidgets 文檔
    3. 運行並跟蹤示例代碼
  3. wxLua編程
    1. wxStrings?
    2. wxArrayString 與 wxSortedArrayString?
    3. wxArrayInt?
    4. 什麼時候 刪除對象,如何刪除?
    5. 爲何在示例中使用main()函數? 它在wxLua有什麼特別嗎?
    6. 在類的成員函數調用時,爲何額外參數常出現錯誤?

  1. 爲何選擇 wxLua?

    1. wxLua與wxPython選擇哪一個?

      • 這取決於: wxPython 比wxLua 應用支持更廣泛,更棒,那是因爲它提供了更多的Python標準庫.
      • 反過來講,wxLua是非常小,大小隻有 wxWidgets庫加上大約100KBLua庫,在加上500多KB的wxLua庫。
      • wxLua 可以很簡單的與C++ 結合,成爲很強大的擴展語言,這也是它的設計意圖。
      • 總之,如果你在一個應用程序中使用腳本語言,你需要Python提供的功能,而在wxlua中還沒有提供,那您應當使用wxPython(功能面選擇wxPython); 相反,如果您在編寫應用程序中考慮的是更小的開銷,或者只是擴展你的C++應用程序,請選擇wxLua. (開銷小,擴展性好,選擇wxLua)
    2. 能將wxlua嵌入我的C++應用程序中作爲腳本解析器嗎?

      • 可以!wxLua的主頁有詳細解釋。
      • 這是wxLua的優點之一,使用輕量且快速的解釋器來擴展您的應用程序,讓用戶可以客製化。
      • 在單個程序中,您願意創建多少wxLua解釋器都可以。
    • 因爲Lua語言簡單, 屬於函數式編程語言,用它編程更有趣 .(譯者注: 這裏的fun一語雙關, 代表函數式編程也指有趣、有意思。)
    • 它看起來與大家熟悉的BASIC或C類似。
    • Lua代碼可讀性非常高,與BASIC或C沒有大的變化,幾乎沒有那些特殊的符號,陷阱,或古怪結構。
    • 大小 : Lua解釋器本身才只有大約100KB,加上wxWidgets也只有 幾Mb而已.
    • 速度 : Lua 幾乎是所有解釋型語言中最快的,看這篇 《偉大語言的決戰》
    • 關於爲何使用Lua的其他內容, 請參考:http://www.lua.org/about.html
  2. 如何學習wxLua

    1. 閱讀 wxLua 文檔

      • wxlua.html是wxLua的手冊,主要介紹Lua語言,wxWidget如何在Lua中實現,以及如何使用。
      • wxluaref.html是自動產生的,可以當做一份參考手冊,它包括wxLua對wxWidgets的封裝說明,以及與 C++ wxWidgets相比一些使用差異的說明。
      • binding.html 描述瞭如何綁定一個用C/C++實現的庫,但是那些只會寫Lua 代碼的人也應該閱讀這份文檔,便於理解 wxluaref.html文檔。
    2. 閱讀C++ wxWidgets 文檔

      • wxLua與wxWidgets匹配的很好,也就是說wxWidgets裏的函數及參數的描述也適用於wxLua。 看看wxluaref.html文檔去驗證一下,所有不一致的行爲都已被清晰的標記出來。
      • 看一下wxWidgets wiki頁面中例子,如何入門,以及其他的有用信息。
      • 閱讀 wxPython文檔及Wiki頁面時需要注意: wxLua一些符合比wxPython更象C++。
    3. 運行並跟蹤示例代碼

      • 示例代碼將儘可能的展示各種類的使用方法。
      • unittest.wx.lua 用於wxlua是否運行正常,但它也提供了豐富的信息: 哪些函數允許調用;如何強制類型轉換; 如何使用虛函數;以及如何導出函數。
      • binding.wx.lua 遍歷在wxLua中使用到的所有C的結構體,非常值得花時間瀏覽一下,看看它們是如何組合在一起的。
  3. wxLua編程

    1. wxStrings?

      • wxLua也能使用Lua string,所以所有使用wxString的函數 也同樣可以使用Lua string.
      • 但如果確實需要,也可使用wxString。
    2. wxArrayString 與 wxSortedArrayString?

      • 所有可以使用wxArrayString或wxSortedArrayString的函數也同樣可以使用已數字爲索引的string表.
      • 所有返回wxArrayStrings 或 wxSortedArrayStrings的函數,如果沒有在wxluaref.html裏特殊說明,也可使用一個wxArrayString 或 wxSortedArrayString代替。
    3. wxArrayInt?

      • 所有可以接收wxArrayInt的函數,也同樣可以接收一個以數字爲索引的數字表(表的索引爲數字,內容也是數字)。
      • 所有返回值爲wxArrayInts類型的函數,如果沒有在wxluaref.html裏特殊說明,也可以使用一個wxArrayInt代替。
    4. 什麼時候 刪除對象,如何刪除?

      • 您應當閱讀 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).
    5. 爲何在示例中使用main()函數? 它在wxLua有什麼特殊含義嗎?

      • main()函數只是一個通用的程序入口名稱,沒有特殊的意義。
      • 我們通常將程序的初始化代碼用一個函數來封裝,這樣做很好,很有用。因爲,您應當使用局部變量,而不要用臨時數據污染全局表。
      • 總之,在調試的時,您可以在任何地方只需要加入"do return end",便可插入初始化代碼。而不是使用大量的 "if false then ... end". 代碼。
    6. 在類的成員函數調用時,爲何額外參數常出現錯誤?

      • 因爲使用':'調用成員函數時,會將 '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'。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章