在 Lua 中,在函数外进行初始工作是一种好的做法吗?

我是Lua的初学者。

目前,我设计了我的Lua环境如下所示。

function setup() --在开始时调用
    --做某事
end

function draw() --每帧调用
    --做某事
end

function exit() --退出时调用
    --做某事
end

我想知道是否最好在函数外面进行初始工作,如下所示。

--在开始时做某事

function draw() --每帧调用
    --做某事
end

function exit() --退出时调用
    --做某事
end

虽然第二个设计更简单、更快速,但是否将初始的东西写在函数外是一种好的实践呢?

这两种设计之间有什么区别?哪种在Lua中更常见?

点赞
用户734069
用户734069

你正在提出错误的问题。这不是“通用”的问题,而是关于什么对你和你的应用程序有用的问题。

Lua 是一种嵌入式语言,它由拥有它的应用程序管理。因此,上述 Lua 脚本执行的方式完全取决于该应用程序的行为。

在第一个例子中,代码被执行了 4 次。你的应用程序必须在某个时候编译并执行这个 Lua 脚本;这是你的 Lua 代码被调用的第一次。然后,在某个可能较晚的时间,setup 被调用。

现在,在编译和执行之间,在调用 setup 期间,你的应用程序发生了什么?或者说,你的应用程序在 setup 期间提供了哪些服务,在编译和执行期间不可用?

例如,假设你的应用程序通过 Direct3D 提供渲染,并向 Lua 脚本公开了从磁盘加载纹理到 D3D 中的能力。当脚本被加载和执行时,D3D 窗口是否已经创建?脚本是否能够控制如何创建该窗口,能够设置大小、帧缓存格式或其他任何东西?还是这个过程发生在其他地方?

如果在执行脚本时 D3D 尚未被初始化,则该脚本 不能 调用加载纹理的函数。

在这种场景下,你的应用程序会承诺在 D3D 被初始化后调用 setup,因此将这种类型的初始化代码放在那里是适当的。

但是,也许你使用一些外部脚本或配置文件来确定如何设置 D3D。因此,当你去编译和执行脚本时,所有接口都是有效的。在这种情况下,将 setup 作为与仅编译和执行相区别的阶段并不是必要的。

然而,现在你必须处理一个奇怪的问题:如果存在编译错误会发生什么?你费力地初始化了 D3D 窗口和其他所有东西,但脚本甚至无法编译。这可能是为了防止简单的拼写错误或其他语法错误而进行的大量工作。

因此,有理由希望在设置环境之前编译和执行脚本,仅仅进行一些基本的检查,确保脚本和它所依赖的任何模块都实际上可以被加载。这样,你不会做一些无用的工作。

如何平衡这些问题最终取决于什么对你自己和你的需求最有用。

2018-06-16 15:55:47