运行时的动态表达式计算器



我有一个应用程序,我想使用某种表达式计算器进行自定义。 我想在不重新编译代码的情况下更改应用程序的某些部分。 我正在考虑使用时髦的表达方式。

例如,我有一个可以通过提供表达式来启用/禁用的功能:

在这种情况下,将启用此功能

Example 1:
EXPRESSION : status = part-time || status = hourly
INPUT: status = part-time

在这种情况下,此功能将被禁用

Example 2:
EXPRESSION : status = part-time || status = hourly
INPUT: status = permanent

用户需要输入表达式和输入。 表达式的计算结果应为布尔表达式

他们还可以更改表达式,程序将通过一些评估来获取此表达式。 顺便说一下,这些表达式被记录下来,并由我向我的应用程序的用户公开

Example 3:
EXPRESSION : salary > 10000
INPUT: salary = 7000

我以前看过一个这样做的程序,他们说他们在引擎盖下使用时髦。 但我无法理解这个概念。

有人可以给我一个想法吗?

使用evaluate的替代方法 .变量在绑定中定义,evaluate包含以下表达式:

// setup binding
def emp = [status:'permanent', name:'Hugo']
def binding = new Binding()
binding.status = 'permanent'
binding.status2 = 'part-time'
binding.salary = 7000
binding.employee = emp
println binding.variables
// evaluate the script
def ret = new GroovyShell(binding).evaluate("status == 'part-time' || status == 'hourly'")
println ret
ret = new GroovyShell(binding).evaluate("status2 == 'part-time' || status2 == 'hourly'")
println ret
ret = new GroovyShell(binding).evaluate("salary > 10000")
println ret
ret = new GroovyShell(binding).evaluate("employee.status == 'permanent' || employee.status == 'hourly'")
println ret

返回

[status:permanent, status2:part-time, salary:7000, employee:[status:permanent, name:Hugo]]
false
true
false
true

时髦脚本的常用调用:

import groovy.lang.Binding;
import groovy.lang.Script;
import groovy.lang.GroovyShell;
Binding binding = new Binding();
binding.setProperty("status", "part-time");
GroovyShell shell = new GroovyShell(binding);
Script script = shell.parse(" status == 'part-time' || status == 'hourly' ");
Object result = script.run();

运行后,将使用变量的新值填充绑定。

您可以缓存解析的脚本(或解析的脚本的类(,因为解析/编译是一个昂贵的过程。

作为替代方案 - 最简单的脚本评估:

Object result = groovy.util.Eval.me("status", "part-time", 
" status == 'part-time' || status == 'hourly' ");

最新更新