了解Java代码解构模式(JEP 405:记录模式和数组模式)



我有一个来自此文档的代码片段: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是一个基类。开关将其与特定的子类匹配,并从记录中提取参数。这些参数在表达式中用于开关表达式的返回值。

因此,如果nIntExpr的实例,则返回记录的int i成员。如果nNegExpr,则将其Expr n成员递归地传递给eval方法,然后在返回结果之前否定结果。类似地,当匹配AddExprMulExpr时,leftrightExpr成员用于递归地评估这些表达式并分别返回和或乘积。

因此,每个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);
}

最新更新