gpt4 book ai didi

groovy - 在 Groovy 表达式中使用文字运算符(例如 "and"、 "or")?

转载 作者:行者123 更新时间:2023-12-04 19:12:14 26 4
gpt4 key购买 nike

我当前的工作项目允许在特定上下文中评估用户提供的表达式,作为他们扩展和影响工作流程的一种方式。这些表达式是通常的逻辑表达式 f。为了让它对非程序员来说有点可口,我想让他们选择使用文字运算符(例如,and、or、not 代替 &、|、!)。

简单的搜索和替换是不够的,因为数据可能包含引号内的这些词,并且构建解析器虽然可行,但可能不是最优雅和最有效的解决方案。

澄清问题: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 }

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

关于groovy - 在 Groovy 表达式中使用文字运算符(例如 "and"、 "or")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com