java - LuaJ中lua模块和基于元表的类的组合

标签 java class lua luaj

我正在遵循 this tutorial 中的简单 lua 类的示例但尝试将类定义存储在单独的文件中并作为模块加载

我创建了一个名为 List 的简单类,我可以创建一个列表,并填充以下代码(List.lua):

local List = {}
List.__index=List
function List.create(t)   -- 2nd version
      local list = {}
      setmetatable(list, List)
    --  self.__index = self
      for i=1,#t do list[i] = t[i] end
      return list
end
function List.fill(self, x)
    for k=1, #self do self[k]=x end
end
return List

要使用它,我只需输入

List = require "List"
a = List.create({1,2,3,4})
print(a)  -- {1,2,3,4}
a:fill(a,0)
print(a) -- shows {0,0,0,0}

到目前为止一切顺利。

问题

现在我将把 List 移动到 LuaJ 中的一个包中,这样我就可以在 Java 中实现 List 了。

public class ListLib extends TwoArgFunction {
    public LuaValue call(LuaValue modname, LuaValue env) {
        LuaTable lib = new LuaTable(0,30);
        List.rawset(LuaValue.INDEX, List);
        //List.rawset(LuaValue.ADD, new add());
        lib.set("create", new create());
        lib.set("fill", new fill());

        String name = "List";
        env.set(name, lib);
        env.get("package").get("loaded").set(name, lib);
        return lib;
    }
    static LuaTable List = new LuaTable();
    static final class create extends OneArgFunction {
        @Override
        public LuaValue call(LuaValue arg) {
            LuaTable list=new LuaTable();
            list.setmetatable(List);
            LuaTable in = (LuaTable)arg;
            for(int i=1; i<=in.length();i++)
                list.set(i, in.get(i));

            return list;
        }
    }
    final class fill extends TwoArgFunction {
        @Override
        public LuaValue call(LuaValue arg1, LuaValue arg2) {
            LuaTable self = (LuaTable) arg1;
            double x = arg2.checkdouble();
            for(int i=1;i<=self.length();i++)
                self.set(i, LuaNumber.valueOf(x));
            return NONE;
        }
    }
}

我可以用同样的方式创建列表,但我现在找不到调用对象 a 的 fill 的方法,例如a:fill(0) 不起作用。显示

attempt to call nil

我可以执行List.fill(a, 0)。这是 LuaJ 的限制吗?还是有其他方法可以使 a:fill(0) 工作?

最佳答案

我犯了一个错误。我创建了一个列表并设置了 __index ,这很好。我还在 ListLib 类开头的调用函数中创建了一个 lib。它返回了lib。我应该做的是:将这两个表合并为一个:List is lib.我这样做之后。现在工作正常。

public class ListLib extends TwoArgFunction {
    public LuaValue call(LuaValue modname, LuaValue env) {
        List.rawset(LuaValue.INDEX, List);
        //List.rawset(LuaValue.ADD, new add());
        List.set("create", new create());
        List.set("fill", new fill());

        String name = "List";
        env.set(name, List);
        env.get("package").get("loaded").set(name, List);
        return List;
    }
    static LuaTable List = new LuaTable();
...

关于java - LuaJ中lua模块和基于元表的类的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51434550/

相关文章:

java - 更新 Java 循环中的总计

java - jta 事务管理器未回滚事务

c# - 两个私有(private)子类到一个公共(public)类

oop - 最好的 Lua OOP 库

nginx - 如何将整个响应数据保存到nginx error.log?

c++ - 如何从 lua 函数返回两个或多个表?

java - Android studio 无法在 Linux 上打开;

java - Jersey Rest 服务何时实际启动/关闭?

c++ - 访问命名空间内的类中的枚举

xcode - 直接访问 Objective-C 的 isa 已弃用,取而代之的是 object_getClass()