Поддержка интерполяции строковых выражений в java-скриптах - PullRequest
0 голосов
/ 15 января 2019

Я использую groovy / nashorn в качестве движка Java, но не могу интерполировать строки.

jdk.nashorn.api.scripting.NashornScriptEngine  scriptEngine =(NashornScriptEngine) factory.getEngineByName("nashorn");
ScriptContext context = scriptEngine.getContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x","Guest");
engine.eval("Hello, ${x}",context);

Но я получаю исключение javax.script.ScriptException. Поддерживается ли интерполяция Sttring? Спасибо

1 Ответ

0 голосов
/ 15 января 2019

Есть две вещи, о которых стоит упомянуть:

  • если вы хотите оценить скрипт Groovy, вам может потребоваться использовать

    new ScriptEngineManager().getEngineByExtension("groovy");
    
  • скрипт, переданный методу engine.eval(), должен быть допустимым Groovy-кодом. Код сценария, который вы передали методу eval, не является допустимым кодом Groovy - вы ожидаете интерполировать строку, но вы не поместили ее в двойные кавычки.

Рассмотрим следующий пример:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("groovy");
ScriptContext context = engine.getContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x","Guest");
Object result = engine.eval("\"Hello, ${x}\"", context);

System.out.println(result);

Выход:

Hello, Guest

Кроме того, вы можете передать Groovy-скрипт, который печатает интерполированный скрипт. В этом случае код может выглядеть следующим образом:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("groovy");
ScriptContext context = engine.getContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x","Guest");
engine.eval("println \"Hello, ${x}\"", context);

Создает тот же вывод, но не присваивает Hello, Guest переменной.

...