【问题标题】:What would make it easier to really work with Lua?什么会使真正使用 Lua 变得更容易?
【发布时间】:2011-04-22 17:15:55
【问题描述】:

我喜欢 Lua,将它作为主要(非嵌入式)语言用于越来越多的项目。我目前的项目接近 10,000 行,可能会以大约 15,000 行结束。在这种规模的 Lua 中进行开发时,您发现了什么有用的东西?您遇到了什么问题,您找到了哪些解决方案?我在考虑开发工具、语言特性和技术、第三方模块?

我的前 3 名:

  1. strict.lua - 我使用它的修改版本。如果没有对未使用/意外变量的访问发出警报,我会发疯的。

  2. 协程 - 不是因为它们的多线程能力,而是因为它们的可连续性。对于简化状态机的实现非常有用。

  3. 序列化功能 - 对于转储表内容和将表持久化到磁盘是必不可少的(我使用了很多次,否则我可能会使用数据库)。

我的愿望清单:

  1. 适用于 OS X 的可视化调试器。我现在使用的是 print(),但如果有一个可以让我单步调试源文件的调试器会很棒。

  2. 继续语句。使用重复...直到真正的解决方法是丑陋的,太多的嵌套 if 变得复杂而丑陋。

  3. 修改现有表成员时调用的元方法。

对于更大规模的 Lua 开发还有其他技巧吗?

【问题讨论】:

    标签: lua


    【解决方案1】:

    继续声明。使用 重复...直到真正的解决方法是 丑陋的,太多的嵌套 if 变成 复杂而丑陋。

    让你的循环体是一个函数调用;然后return 变为continue

    一个元方法,当一个 已修改现有表成员。

    您可以通过使用存储表 A 的所有实际数据的代理表 B 自行实现这一点 - A 上的 newindex/index 元方法截取表 B 的写入/读取和修改/查找。由于 A 从来没有向它写入任何内容,因此所有写入都会命中 newindex。

    【讨论】:

    • 不幸的是,这对于嵌套表来说效果不佳。我做了一个递归function 来测试新值是否为table,并将其metatable 设置为相同的function,所以我可以挂钩它。问题是,当它是另一个primitive type 时该怎么办?我有两个嵌套表和一个string 在一个由"reason" 索引的内部表中,如果更改之前的初始值不是nil,如何检测string 的变化?
    • 哦!我只需要以编程方式实现这个代理!
    【解决方案2】:

    根据您的前 3 名和愿望清单,以下是我从事的产品和可以推荐的产品(至少根据我收到的反馈):

    1. MobDebug:基于 RemDebug 的远程调试器,但有多种修复和新功能。
    2. ZeroBrane Studio:一个 Lua IDE,它提供了一个具有所有预期功能(StepIn/Over/Out、Break、Watch、Stack、Breakpoints、远程 shell、序列化支持、协程支持等)的调试器,并在 OSX 和 Windows 上运行。它提供了与 IDE 中的 MobDebug 的无缝集成。我发布了几个显示它的屏幕录像:http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-stylehttp://notebook.kulchenko.com/zerobrane/love2d-debugging
    3. Serpent:紧凑而强大的串行器。 ZeroBrane Studio 正在使用 Serpent 在控制台和堆栈窗口中显示复杂的数据结构。
    4. ZeroBrane Studio 包含一个 static analyzer(基于 metalua 和 lua-inspect),它允许您检测与 strict.lua 检测到的相同(以及更多)问题,但在开发期间(在运行代码之前)。李>
    5. 在观察变化方面,MobDebug 提供了一种对任何类型的变量(不仅仅是表)执行此操作的方法。我已经在另一个SO post 中描述了它。 ZeroBrane Studio 尚不提供此功能。

    【讨论】:

      【解决方案3】:

      OS X 的可能调试选项:

      【讨论】:

        猜你喜欢
        • 2015-09-01
        • 2017-02-23
        • 1970-01-01
        • 2023-03-22
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        相关资源
        最近更新 更多