我有一个来自此文档的代码片段:JEP405:Record Patterns&阵列模式(预览(。
我试图理解这段代码以及它的基本功能,以便用c(使用union(、java或sml,甚至pascal/kotlin重写它。
有人能为我解释一下这段代码的含义吗?
int eval(Expr n) {
return switch(n) {
case IntExpr(int i) -> i;
case NegExpr(Expr n) -> -eval(n);
case AddExpr(Expr left, Expr right) -> eval(left) + eval(right);
case MulExpr(Expr left, Expr right) -> eval(left) * eval(right);
default -> throw new IllegalArgumentException(n);
};
}
我知道它在用n进行模式匹配,但我不明白的是,它们从哪里来的??我们用n得到它们吗?我迷路了,有人能帮我吗
Expr
是一个基类。开关将其与特定的子类匹配,并从记录中提取参数。这些参数在表达式中用于开关表达式的返回值。
因此,如果n
是IntExpr
的实例,则返回记录的int i
成员。如果n
是NegExpr
,则将其Expr n
成员递归地传递给eval
方法,然后在返回结果之前否定结果。类似地,当匹配AddExpr
或MulExpr
时,left
和right
Expr成员用于递归地评估这些表达式并分别返回和或乘积。
因此,每个case都将特定类型与指定字段相匹配,并使这些字段可用于为switch表达式的值计算和返回的表达式。
另请参阅https://openjdk.java.net/jeps/406
这可以重写为:
int eval(Expr n) {
if (n instanceof IntExp ie) {
return ie.i;
}
if (n instanceof NegExpr ne) {
return -eval(ne.e);
}
if (n instanceof AddExp ae) {
return eval(ae.left) + eval(ae.right);
}
if (n instanceof MulExpr me) {
return eval(me.left) * eval(me.right);
}
throw new IllegalArgumentException(n);
}