gpt4 book ai didi

LuaJ:无法在 Lua 脚本中调用 'require' 函数

转载 作者:行者123 更新时间:2023-12-04 20:11:29 25 4
gpt4 key购买 nike

我很有可能正在做一些导致此错误的奇怪事情。

以下简单示例失败:

--> thingy.lua
function doThing()
print( "Thing has been done." );
end



--> test.lua
require( "thingy" );

执行thingy.lua时,没有问题。执行 test.lua 时,我看到以下错误:
script:2 module 'thingy' not found: thingy
no field package.preload['thingy']
thingy.lua
no class 'thingy'

这两个文件都存在于同一目录中,我可以使用 SciTE(运行 Lua 5.1)运行这两个脚本而不会出错。似乎是路径问题,所以我尝试设置 包路径是源文件的绝对路径。

注意:我设置了路径,而不是附加路径,以便我可以确定 SciTE 由于现有的相对路径“?.lua”而没有成功。

我在 LauJ(使用我自己的程序)和 SciTE 中进行了测试,发现 SciTE 能够执行 test.lua,而 LuaJ 仍然无法执行,产生与往常一样的错误。

我应该在 Java 代码中做什么(或不做什么)可能会导致这种情况?我已经成功地从 Lua 脚本访问 Java,而不是其他 Lua 脚本。只要我手动运行包含它们的脚本,我就可以在 LuaJ 中访问全局变量和函数。

只是为了更好地衡量,这里是我用来执行脚本的 Java 代码。

// some fancy Java code
public void execute() throws ScriptException, LuaError
{
try
{
FileReader reader = new FileReader( filename );
Script_Engine.eval( reader );
reader.close();
}
catch( FileNotFoundException fnfe )
{
fnfe.printStackTrace();
}
catch( IOException ioe )
{
ioe.printStackTrace();
}
}

public void callFunction( String functionName, Object[] args ) throws Exception
{
File scriptFile = new File( filename );
FileReader reader = new FileReader( scriptFile );

CompiledScript script = ((Compilable)Script_Engine).compile( reader );
script.eval( Script_Bindings );

LuaFunction lua_function = (LuaFunction)Script_Bindings.get( functionName );
LuaValue[] vals = new LuaValue[args.length];
for( int i = 0; i < args.length; i++ )
{
vals[i] = CoerceJavaToLua.coerce( args[i] );
}
lua_function.invoke( vals );
reader.close();
}

两个函数中使用的“文件名”变量是在房屋类的构造函数中创建的。

更新:
我发现,无论问题是什么,它都存在于 LuaJ 3.0 版中(我使用的是 JSE 包)。用旧的 2.03 JAR 替换 3.0-alpha2 JAR 文件后,问题不再存在。虽然我很满意现在可以继续使用旧版本的 LuaJ,但我仍然更愿意使用最新版本。

在 LuaJ 自述文件中找到了一些东西 here上面写着:

When require() is called, it will first attempt to load the module as a Java class that implements LuaFunction.



并在发行说明部分下:

3.0-alpha2
Supply environment as second argument to LibFunction when loading via require()



我强烈怀疑它与此有关,因为它是在 3.0-alpha2 版本中添加的,所以我下载了 3.0-alpha1 版本(正在使用 3.0-alpha2),希望它可以工作,但它没有。

最佳答案

在与 LuaJ 的创建者进行了一些对话后,我们确定问题出自 3.0-alpha1 版本开始的更改,其中 lua 的 包路径通过 加载脚本时被忽略要求 .这意味着 require 只会在路径“.”中查找。搜索脚本时。如果有从子目录调用的脚本,则称其为“place”,然后 要求 可以通过使用点运算符加载它们来找到这些脚本:

require( "place.thingy" );

我怀疑原因是这个问题的数量 包路径社区中的问题有些稀缺是因为有一种方法可以从 Java 端设置路径,该方法适用于 LuaJ v3.0 的先前版本。 (一旦我弄清楚了,我将发布有关执行此操作的正确方法的更新,因为我仍然不清楚该过程。)

整个情况的多头和空头是应该很快就会有一个 LuaJ v3.0-alpha3 允许 包路径从lua设置。

再次感谢 Jim Roseborough 与我一起解决这个问题。

Jim Roseborough 的注释:正如 Nathan 所提到的,这确实是 luaj-3.0-alpha2 及之前版本中的一个错误。这已得到修复,应该在 luaj-3.0-beta1 及更高版本中按预期工作,现在可用。

关于LuaJ:无法在 Lua 脚本中调用 'require' 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com