我想將函數添加到可以運行Java代碼的_G
。我正在使用Luaj,它已經可以運行用戶編寫的Lua代碼,但我想添加apis,以允許用戶與遊戲世界進行交互。如何向使用Luaj運行Java代碼的_G添加函數?
4
A
回答
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%確定它的工作原理。
相關問題
- 1. 使用MPI函數運行Java代碼
- 2. LuaJ加入的Java
- 3. 如何使用Java代碼運行Java代碼?
- 4. 如何添加代碼在運行時
- 5. LuaJ如何在調用對象上運行函數(LuaJ正在創建新對象如何避免它)
- 6. 如何在運行時向對象添加代碼? - Livecode
- 7. 如何在運行時向頁面添加JavaScript代碼?
- 8. 如何在Eclipse中運行java代碼時添加命令行參數?
- 9. 如何獲得java類中的Luaj函數參數名稱?
- 10. LuaJ - 在Java中創建Lua函數
- 11. 如何從我的Java代碼使用Apache Felix?如何添加maven POM代碼?
- 12. 如何使用構造函數代碼在java中執行類?
- 13. 使用BeanShell的運行Java代碼
- 14. 向java文件添加scala代碼
- 15. 向java代碼添加延遲
- 16. 如何使用Object.prototype向Object構造函數添加函數?
- 17. 如何向Visual Studio添加api代碼
- 18. 如何使用進程並行運行兩個Java代碼
- 19. 使用Java代碼向ARFF添加問號
- 20. 如何用Python代碼運行Windows powercfg的函數?
- 21. 如何在1行代碼中向c#DataTable添加新行?
- 22. 使用System.console運行java代碼類
- 23. 運行.sql文件使用java代碼
- 24. 如何優化向數據存儲添加數據的代碼?
- 25. 如何使用solrj/java代碼獲得solr的運行狀態
- 26. 如何將C++中的反向函數代碼轉換爲Java
- 27. 在運行時在java中添加額外的代碼
- 28. 如何在運行時添加和追加代碼? - livecode
- 29. 如何在JAVA中添加RSS代碼
- 30. 如何在WEEBLY中添加java代碼