我在lua中编写一个基本事件处理程序,它使用位于另一个模块中的一些代码
const result = Array.from(document.querySelectorAll(".container"))
.filter(c => c.querySelector("a[origin=internal]"))
.map(c => c.querySelector("button.delete"));
console.log(result);
但是每当触发事件时我都会收到以下错误
<div class="container">
<div class="data">
<a class="myclass" href="foo" origin="internal"> A </a>
</div>
<div class="actions">
<button class="save" role="add" add="Save" remove="Remove"> Save </button>
<button class="delete" role="add" remove="Discard" rel="nofollow"> Discard A </button>
</div>
</div>
<div class="container">
<div class="data">
<a class="myclass" href="foo" origin="external"> B </a>
</div>
<div class="actions">
<button class="save" role="add" add="Save" remove="Remove"> Save </button>
<button class="delete" role="add" remove="Discard" rel="nofollow"> Discard B </button>
</div>
</div>
<div class="container">
<div class="data">
<a class="myclass" href="foo" origin="internal"> C </a>
</div>
<div class="actions">
<button class="save" role="add" add="Save" remove="Remove"> Save </button>
<button class="delete" role="add" remove="Discard" rel="nofollow"> Discard C </button>
</div>
</div>
为什么会这样,我该如何解决?
答案 0 :(得分:0)
require()
不会自动创建全局表,它会将模块值返回到您调用此函数的位置。要通过全局变量访问模块,您应该手动分配:
local caves = require "caves"
答案 1 :(得分:0)
打开有问题的模块并查看它导出的内容(分配了哪些全局变量以及在文件底部返回了哪些本地变量)。或者纠缠mod作者来创建界面。
Lua require(filename)
只查找文件filename.lua
并运行它,代表模块初始化。如果通过运行文件返回任何内容,它将被分配到lua(不是那么)隐藏表(可能也就是说,require
函数的缓存),如果没有返回但没有错误,布局true
被分配给该表以指示之前已加载filename.lua
。相同的true
将返回到caves = require('caves')
中等于左侧的变量。
其他任何事情都留给了作者的良心。 如果模块文件内部函数是这样写的(显示了两个变体):
init_layer = function(game)
%do smth
end
function move_down(player)
%do smth
end
然后在调用require
后,这些函数在您的全局环境中,用相同的名称覆盖变量。
如果他们是这样的话:
local init_layer = function(game)
%do smth
end
local function move_down(player)
%do smth
end
然后你不会从外面得到它们。
您的代码希望该模块编写为:
caves = {
init_layer = function(game)
%do smth
end
}
caves.move_down=function(player)
%do smth
end
这是做模块的旧方法,它目前已被移走,但并未被禁止。像torch
这样的大型库仍然使用它,因为无论如何你最终都会将它们分配给相同的命名全局变量。
Кирилл的回答与较新的风格有关:
local caves={
%same as above
}
%same as above
return caves
我们在这里无法了解更多。其余的由你决定,无论如何,lua脚本都是事实上的开源。
附录:event_handler不是lua语言的一部分,它是由您的宿主程序提供的东西,其中嵌入了lua并且相应的标记是多余的。
您应该查阅您的软件文档,了解script.on_event
在这种特殊情况下可能无关紧要的内容,但通常将另一个函数作为参数的函数可以将其转储到字符串然后尝试加载它并且在没有upvalues和后者可能引用的全局变量的情况下在不同的环境中运行。