मैं javax.scripting मानचित्र कार्यान्वयन में कुछ अजीब व्यवहार देख रहा हूं।javax.scripting जावास्क्रिप्ट पर्यावरण में मानचित्र आयात करना
ऑनलाइन उदाहरण js पर्यावरण के भीतर एक सूची में जोड़ने के example दिखाने:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
List<String> namesList = new ArrayList<String>();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");
jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try
{
jsEngine.eval("var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}"
+ "namesListKey.add(\"Dana\");");
} catch (ScriptException ex)
{
ex.printStackTrace();
}
System.out.println(namesList);
हालांकि, अगर आप एक नक्शे के साथ कुछ ऐसा ही करने की कोशिश, तो आप अजीब व्यवहार देखते हैं। एक चीज़ के लिए, यदि आप मानचित्र कुंजी के माध्यम से पुन: प्रयास करने का प्रयास करते हैं, उदा।
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
नक्शा कुंजी प्राप्त करने के लिए कोई तरीका नहीं है - अगर आप कुंजी के माध्यम से पुनरावृति करने की कोशिश, आप विधि प्राप्त names-
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
परिणामों में:
notifyAll
removeAll
containsAll
contains
empty
equals
...
js में संदर्भ आप मानचित्र में m.get(key)
के साथ नक्शे में मूल्यों को संबोधित कर सकते हैं लेकिन m[key]
के साथ नहीं, और यदि कुंजी मौजूद नहीं है तो यह एक त्रुटि फेंकता है। क्या कोई इस व्यवहार पर कुछ प्रकाश डाल सकता है, या यह सिर्फ टूटा हुआ है? धन्यवाद।
बहुत दिलचस्प है। यह ऑब्जेक्ट्स कुंजीसेट पर राइटर हो सकता है (राइनो में आप विधियों पर लूप कर सकते हैं), लेकिन मुझे यकीन नहीं है। मुझे इसे – TheLQ