wxLua 2.8.10 - FAQ

来源:互联网 发布:服务器tcp端口怎么开 编辑:程序博客网 时间:2024/05/03 06:59

原文作者: John Labenski; 翻译:刘贵学(liuguixue@gmail.com)

  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'。
原创粉丝点击