2012-11-17 14 views

回答

4

您爲每個庫函數和一個類創建一個類來加載函數。根據您的函數需要多少參數(最多三個參數,然後您需要製作自己的FourArgFunction)來擴展適當的類。

這裏的從luaj源MathLib.java文件下調示例代碼(在這裏找到:http://sourceforge.net/projects/luaj/files/latest/download):

這是你需要的時候,添加你的庫加載什麼。

public class MathLib extends OneArgFunction { 
    public static MathLib MATHLIB = null; 
    public MathLib() { 
     MATHLIB = this; 
    } 

    public LuaValue call(LuaValue env) { 
     LuaTable math = new LuaTable(0,30); // I think "new LuaTable()" instead of "(0, 30)" is OK 
     math.set("abs", new abs()); 
     math.set("max", new max()); 
     env.set("math", math); 
     env.get("package").get("loaded").set("math", math); 
     return math; 
    } 
} 

您加載這樣的:

globals.load(new MathLib()); 

然後你讓MathLib的子類,每個庫函數。對於它有一個參數的函數,這裏有一個例子:

abstract protected static class UnaryOp extends OneArgFunction { 
    public LuaValue call(LuaValue arg) { 
     return valueOf(call(arg.checkdouble())); 
    } 
    abstract protected double call(double d); 
} 

static final class abs extends UnaryOp { 
    protected double call(double d) { 
     return Math.abs(d); 
    } 
} 

你不需要的抽象類,你可以做abs直接,但如果你看看,這是更方便易源很明顯當你需要實施大量的數學一元運算時,可以這樣做。

這裏有一個例子爲需要的參數變量量的函數:

static class max extends VarArgFunction { 
    public Varargs invoke(Varargs args) { 
    double m = args.checkdouble(1); 
    for (int i=2,n=args.narg(); i<=n; ++i) 
     m = Math.max(m,args.checkdouble(i)); 
    return valueOf(m); 
} 

從Lua,你這樣做:require('math')加載的lib,然後像math.abs(-123)調用一個lib功能。

如果這很難理解,我真的推薦檢查luaj的來源。此外,我修剪下來的代碼沒有經過測試,所以我不能100%確定它的工作原理。

相關問題