【问题标题】:Is it possible to access userdata properties and functions? [duplicate]是否可以访问用户数据属性和功能? [复制]
【发布时间】:2016-11-22 13:19:36
【问题描述】:

我想将一个 Java 类的实例作为用户数据返回给我的 lua 脚本。是否可以从 lua 访问此实例的属性和功能?

像这样

local car = Car.getNew()
print(car.hasHonked)
car:honk()
print(car.hasHonked)

这是我解决问题的尝试

Java(缩写)

public class CarModule extends TwoArgFunction {

    String moduleName = "Car";

    public LuaValue call(LuaValue modname, LuaValue env) {
        LuaValue library = new LuaTable();
        library.set("getNew", new getNew());
        env.set(moduleName, library);
        return library;
    }

    static class getNew extends ZeroArgFunction {
        @Override
        public LuaValue call() {
            return LuaValue.userdataOf(new Car());
        }
    }    
}

public class Car {
    private int count;

    @Override
    public String toString() {
        return "Hello World";
    }

    public void honk() {
        count++;
    }

    public int getHonks() {
        return count;
    }
}

lua

local car = Car.getNew()
print(car) -- foo.bar.lua.module.CarModule$Car@1ef7fe8e
print(type(car)) -- = userdata
print(car.honk) -- = nil
print(car.getHonks) -- = nil
print(car:honk) -- = LuaError: function arguments expected
print(car:getHonks) -- = LuaError: function arguments expected
print(tostring(car)) -- = Hello World
car:honk() -- = LuaError: attempt to call nil
car:getHonks() -- = LuaError: attempt to call nil

编辑:

找到答案here

代替

return LuaValue.userdataOf(new Car());

我必须使用

return CoerceJavaToLua.coerce(new Car());

【问题讨论】:

    标签: java lua luaj


    【解决方案1】:

    您可以尝试将对car.hasHonked 的访问链接到从java 返回值的函数。 我没有使用过 luaj,所以我无法评论它究竟是如何完成的,但这里是使用 lua 完成的相同原理。您需要做的就是将 __index 函数替换为可以访问变量的函数。 该代码使用元表​​来允许将未找到的键链接到函数。

    Car = {}
    function Car.__index(table, key)
        print(Car, table, key)
        return "the java value according to key"
    end
    function Car.getNew()
        return setmetatable({}, Car) -- sets metatable for userdata or table
    end
    
    local car = Car.getNew()
    
    print(car.hasHonked)
    -- prints:
    -- table: 0xa64f80  table: 0xa6e370 hasHonked
    -- the java value according to key
    

    另一种选择可能是直接使用下面的函数。这些函数会调用 java 并返回真正的 java 值。

    car = {}
    function car.getHonked()
        return "the java value"
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多