2012-09-10 12 views
7

मैं लुआज + जावा का उपयोग कर नियंत्रक बनाने की कोशिश कर रहा हूं।मैं ऑब्जेक्ट्स को एक खुला लुज फ़ंक्शन में कैसे पास कर सकता हूं?

onTalk(obj) 
    obj:talk(); 
end 

onWalk(obj) 
    obj:walk(); 
end 

मैं आदर्श जहाँ मैं कार्यक्रम के के सभी रखेंगे (lua में लिखा) एक नियंत्रक परिभाषित करना चाहते हैं: मैं निम्नलिखित जावा

public class Duck { 
    public void talk() { System.out.println("Duck quacks!"); } 
    public void walk() { System.out.println("Duck walks!"); } 
} 

public class Person { 
    public void talk() { System.out.println("Person talks!"); } 
    public void walk() { System.out.println("Person walks!"); } 
} 

वर्गों और नियंत्रक के लिए निम्नलिखित lua स्क्रिप्ट है तर्क, और मैं उस जावा नियंत्रक से अपने जावा कोड में एपीआई का पर्दाफाश करना चाहता हूं। मैं निम्नलिखित दृष्टिकोण का उपयोग करने की कोशिश कर रहा था:

ScriptEngineManager sem  = new ScriptEngineManager(); 
ScriptEngine  engine = sem.getEngineByExtension(".lua"); 
ScriptEngineFactory factory = engine.getFactory(); 

// Script defined above 
CompiledScript cs = ((Compilable)engine).compile(MY_LUA_SCRIPT); 
SimpleBindings b = new SimpleBindings(); 

b = newSimpletBindings(); 

LuaValue onWalkHandler = (LuaValue)b.get("onWalk"); 
//func.call(LuaValue.valueOf(duck)); // Passing duck object does not work ??? 

मैं ऑब्जेक्ट को LuaValue में पास करने में सक्षम नहीं हूं। मैं लुवा लिपि में जावा ऑब्जेक्ट कैसे पास कर सकता हूं?

पीएस: सामान्य रूप से, जावा और एम्बेडेड स्क्रिप्टिंग का उपयोग करते समय, क्या लोग एक स्क्रिप्ट में फ़ंक्शंस को बंडल करते हैं, या क्या प्रत्येक कॉलबैक के लिए एक अलग स्क्रिप्ट है?

उत्तर

24

मैं प्रविष्टियों को खोज रहा था और आपके अनुत्तरित पाया। आपका प्रश्न दिलचस्प था और मुझे खोज बना दिया। तब मुझे एहसास हुआ कि 2 साल पहले पूछा गया था ... मुझे उम्मीद है कि मेरा जवाब किसी और के लिए उपयोगी हो सकता है! कोड luaj-3.0-alpha1 पर आधारित है।

हम (आप function कीवर्ड भूल गया) एक वैध लुआ स्क्रिप्ट की जरूरत है:

function onTalk(javaObj) 
    print(type(javaObj) .. " " .. tostring(javaObj)) 
    print(javaObj.name) 
    javaObj:talk() 
    return true 
end 

function onWalk(javaObj) 
    javaObj:walk() 
    return 1, "km" 
end 

मैं ट्रेस का एक सा जोड़ा ... मैं भी इसी तरह की कक्षाओं बनाया आपके लिए:

class Dog 
{ 
    public String name; 
    Dog(String n) { name = n; } 
    public void talk() { System.out.println("Dog " + name + " barks!"); } 
    public void walk() { System.out.println("Dog " + name + " walks..."); } 
} 
class Cat 
{ 
    String name; 
    Cat(String n) { name = n; } 
    public void talk() { System.out.println("Cat " + name + " meows!"); } 
    public void walk() { System.out.println("Cat " + name + " walks..."); } 
} 

इसका परीक्षण करने के लिए एक फ़ील्ड जोड़ना भी। अपने परीक्षण के लिए, मैं सिर्फ विधि उनके उदाहरणों बनाने के अंदर वर्गों की घोषणा की:

Dog dog = new Dog("Rex"); 
Cat cat = new Cat("Felix"); 

मैं पहली बार इन जावा लुआ को वस्तुओं, LuaValue luaDog = LuaValue.userdataOf(dog); का उपयोग कर कन्वर्ट करने के लिए कोशिश की, लेकिन यह काम नहीं करता: हम वास्तव में, userdata है दिखाया गया है निशान से, लेकिन कोई मेटाटेबल नहीं है, इसलिए हम विधियों को कॉल नहीं कर सकते हैं और न ही फ़ील्ड तक पहुंच सकते हैं।

एक बहुत खोज के बाद, मैं सही जादू पता चला:

CompiledScript script = ((Compilable) scriptEngine).compile(reader); 
Bindings sb = new SimpleBindings(); 
script.eval(sb); // Put the Lua functions into the sb environment 
LuaValue luaDog = CoerceJavaToLua.coerce(dog); // Java to Lua 
LuaFunction onTalk = (LuaFunction) sb.get("onTalk"); // Get Lua function 
LuaValue b = onTalk.call(luaDog); // Call the function 
System.out.println("onTalk answered: " + b); 
LuaFunction onWalk = (LuaFunction) sb.get("onWalk"); 
LuaValue[] dogs = { luaDog }; 
Varargs dist = onWalk.invoke(LuaValue.varargsOf(dogs)); // Alternative 
System.out.println("onWalk returned: " + dist); 

मैं Luaj एपीआई ... :-) शायद अधिक जावा प्रोग्रामर के लिए बनाया की सराहना करते हैं, जबकि अन्य पुस्तकालयों लुआ में और अधिक उद्देश्य के लिए लग रहे हैं/सी प्रोग्रामर ...

+3

पवित्र बकवास यह सोने है। धन्यवाद। – Qix

संबंधित मुद्दे

 संबंधित मुद्दे