2013-01-24 37 views
5

Tôi đang cố gọi hàm lua trong chương trình Java bằng LuaJ. Nó hoạt động tốt khi tôi không vượt qua bất kỳ đối số nào để đóng cửa:Truyền đối số cho hàm lua với luaj

String script = "print 'Hello World!'"; 
InputStream input = new ByteArrayInputStream(script.getBytes()); 
Prototype prototype = LuaC.compile(input, "script"); 
LuaValue globals = JsePlatform.standardGlobals(); 
LuaClosure closure = new LuaClosure(prototype, globals); 
closure.call(); 

Nhưng bây giờ tôi đang thử một kịch bản lua với chức năng cấp cao cần tranh cãi và tôi không thể tìm ra cách để vượt qua trong đối số từ Java. Dưới đây là những gì tôi có cho đến nay:

String script = "function something(argument)\n"+ 
          "test_string = 'Hello World!'\n"+ 
          "print(test_string)\n"+ 
          "print(argument)\n"+ 
       "end"; 

InputStream input = new ByteArrayInputStream(script.getBytes()); 
Prototype prototype = LuaC.compile(input, "script"); 
LuaValue globals = JsePlatform.standardGlobals(); 
LuaClosure closure = new LuaClosure(prototype, globals); 
closure.invokemethod("something", CoerceJavaToLua.coerce("Foo")); 

Điều này dẫn đến một ngoại lệ trên dòng invokemethod:

org.luaj.vm2.LuaError: attempt to index ? (a function value)

Nhờ sự giúp đỡ của bạn!

Trả lời

0

Kể từ khi bạn nhận được

org.luaj.vm2.LuaError: attempt to index ? (a function value)

như lỗi của bạn; điều này có nghĩa là chức năng của bạn không được tạo ra.

Hãy dùng thử mà không cần \n và cung cấp khoảng trắng trong biến script. Như thế này:

String script = "function something(argument) " + 
     " test_string = 'Hello World!'; " + 
     " print(test_string); " + 
     " print(argument); " + 
     " end"; 
+0

Điều đó dường như không phải vậy. Tôi nhận được cùng một lỗi chính xác. Ngoài ra, nếu kịch bản không chính xác bằng cách nào đó, không nên cuộc gọi LuaC.compile đã thất bại? – nerdinand

3

Trong lua, phạm vi cấp cao nhất là một hàm ẩn danh với các đối số biến. Chúng được truy cập bằng cách sử dụng ... Trong ví dụ của bạn, bạn không cần hàm có tên gì đó, bản thân đoạn này có thể được sử dụng như một hàm chưa được đặt tên.

Ví dụ, mã này trong luaj-3.0-beta1

String script = "argument = ...\n"+ 
"test_string = 'Hello World!'\n"+ 
"print(test_string)\n"+ 
"print(argument)\n"; 

Globals globals = JsePlatform.standardGlobals(); 
LuaValue chunk = globals.loadString(script, "myscript"); 
chunk.call(LuaValue.valueOf("some-arg-value")); 

Được sản xuất kết quả này cho tôi:

Hello World! 
some-arg-value 

Bạn có thể vượt qua trong bất kỳ số lượng các đối số theo cách này.

+0

giải thích của bạn về chức năng ẩn danh đã xóa rất nhiều thứ. Tôi có một câu hỏi trên mã bạn: tôi có thể đọc các biến được xác định trong kịch bản LUA trở lại vào JAVA, như biến "test_string"? –

Các vấn đề liên quan