在Groovy表达式中使用文字运算符(例如“and”,“或”)?
发布时间:2020-12-14 16:24:31 所属栏目:大数据 来源:网络整理
导读:我当前的工作项目允许在特定的上下文中评估用户提供的表达式,作为他们扩展和影响工作流的一种方式.这些表达式通常是逻辑上的.为了使它对非程序员来说有点可口,我想给他们选择使用文字运算符(例如和,或者,而不是代替,|,!). 一个简单的搜索替换是不够的,因为
我当前的工作项目允许在特定的上下文中评估用户提供的表达式,作为他们扩展和影响工作流的一种方式.这些表达式通常是逻辑上的.为了使它对非程序员来说有点可口,我想给他们选择使用文字运算符(例如和,或者,而不是代替&,|,!).
一个简单的搜索&替换是不够的,因为数据可能包含引号内的那些单词并构建解析器,虽然可行,但可能不是最优雅和有效的解决方案. 要明确问题:Groovy中是否有一种允许用户编写的方法 x > 10 and y = 20 or not z 但是让Groovy对它进行评估,好像它是: x > 10 && y == 20 || !z 谢谢. 解决方法
最新版本的Groovy支持
Command chains,因此确实可以这样写:
compute x > 10 and y == 20 or not(z) 这里的“计算”一词是任意的,但不能省略,因为它是命令链中的第一个“动词”.随后的所有内容在动词和名词之间交替出现: compute x > 10 and y == 20 or not(z) ───┬─── ──┬─── ─┬─ ───┬─── ─┬─ ──┬─── verb noun verb noun verb noun 命令链的编译方式如下: verb(noun).verb(noun).verb(noun)... 所以上面的例子被编译为: compute(x > 10).and(y == 20).or(not(z)) 有很多方法可以实现这一点.这只是一个快速的&脏概念,不实现运算符优先级,以及其他: class Compute { private value Compute(boolean v) { value = v } def or (boolean w) { value = value || w; this } def and(boolean w) { value = value && w; this } String toString() { value } } def compute(v) { new Compute(v) } def not(boolean v) { !v } 您可以单独使用命令链(作为顶级语句),也可以使用赋值运算符的右侧(局部变量或属性赋值),但不能在其他表达式中使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |