Lua require error if script is called "table.lua"?

尝试复制 这个简单的Lua例子(使用 第二个 帖子中改进的代码),我遇到了以下奇怪的问题:

我完全照搬了代码,但是我第一个文件的名字 coincidentally 是 "table.lua"(而不是 "funcs.lua")。第二个文件被称为在例子中的 "main.lua"。

在我的情况下,无论我如何尝试,我总是会得到热门的错误消息 "a ttempt to call field 'myfunc' (a nil value)" (就像 require 语句被忽略了一样,但是路径等都是正确的)。

试了两个小时并寻找信息后,我几乎凭直觉将第一个文件从 "table.lua" 重命名为 "tabble.lua",然后所有事情都按预期工作了。重命名为例如 "tables.lua" 也可以。

作为 Lua 的新手,我仍然想了解到底出了什么问题。最初我认为原因可能是 "table" 是一个保留的 Lua 字,但我检查的所有参考都没有将其列为这样的字。

所以这里到底发生了什么?

我正在使用 LuaForWindows v5.1.4-46 和包括的 SciTE 编辑器/IDE(v.1.75)。

感谢所有的提示。

点赞
用户805875
用户805875

Lua 解释器预定义(并预加载)了标准库 mathiostring......和 table。因为 require 会根据名称缓存模块,所以说 require "table" 会返回标准的 table 库,而不是从文件加载自己的 table 模块。

解决这个问题的好方法是创建一个文件夹并把你的库文件放进去。如果文件夹叫做 mylib,那么 require "mylib.table" 就可以工作并加载文件。

或者,如果你只需要加载文件一次并且不需要 require 的功能(在多个目录中搜索文件,缓存已加载的库等),你可以使用 loadfile: 把 require "table" 改成 loadfile "./table.lua" ()(其中 ./table.lua 应该是文件的完整路径(相对路径也可以)。)

2017-10-03 18:20:05