加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在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 }

您可以单独使用命令链(作为顶级语句),也可以使用赋值运算符的右侧(局部变量或属性赋值),但不能在其他表达式中使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读