Eval方法沃森谈话?

时间:2017-05-05 08:33:07

标签: javascript spring-el watson-conversation

我对Watson Conversations专家提出了另一个问题;)我有一个新问题。我需要将一个字符串计算为一个变量名:我创建了4个静态值:

{ "Pmarguerita": 9,
    "Pregina": 10,
    "Pcarne": 10,
    "PEVEA": 12
}

当我解析用户的输入时,我会像这样连接:

{
"PiPrice": "<? 'P'+entities['name_pizza'][0].value ?>"
"total" :"<?entities['sys-number'][0].value.toInt() * eval(PiPrice) ?>"
}

但Eval函数无法识别,我无法找到任何文档,允许将变量值计算为变量名的值,如python:

a = 3
b ='a' 
print(eval(b))
3

我可以使用多个节点做一个if ifif-like-like块,但如果用户的输入开始变得很重要,那么它所需的节点数量将成倍增长。 有没有办法在App构建器管道中找到的app.js src代码中使用它?

2 个答案:

答案 0 :(得分:1)

I tested something similar and came up with the following workaround:

  • I split the node in two, each using one evaluation (<? ?>)
  • The first node has an empty output, but sets a context variable to the evaluated value. The node is configured to jump to another node (the second node).
  • The second node has the final evaluation and generates the output (response).

答案 1 :(得分:0)

虽然@data_henriks回答是在对话中执行此操作的正确方法,但有时您需要在应用程序层执行此操作。

因此,您将每个项的值作为上下文变量返回,然后创建一个上下文变量,如"run_eval",并使其值与您要使用上下文变量名执行的eval语句匹配。使用设置的上下文变量作为返回值。

例如:

"context": {
  "Pmarguerita": 9, 
  "Pregina": 10,
  "Pcarne": 10,
  "PEVEA": 12,
  "PiPrice": "<? 'P'+entities['name_pizza'][0].value ?>",
  "Items": "<?entities['sys-number'][0].value.toInt() ?>"
  "run_eval" : "$PiPrice * $Items",
  "run_eval_return_field": "total"
}

在您的应用程序层,您将解析出run_eval,这样您最终会得到类似的结果(5项,每项10美元)。

10 * 5

然后eval(),然后返回会话,如下所示:

"context": {
  "Pmarguerita": 9, 
  "Pregina": 10,
  "Pcarne": 10,
  "PEVEA": 12,
  "PiPrice": "10",
  "Items": "5"
  "total": "50"
}

不言而喻,你需要处理运行eval的危险。