Kotlin 示例之 Expr
2020-06-25 本文已影响0人
秋雁上海
目标
演示 Kotlin 的一些典型用法。
参考
问题
算术表达式求值,如 (1 + 2) + 4。以下集中于Kotlin 的实现,忽略了词法分析,仅实现加法,其他可以类似的加以实现。
分析
表达式 (1 + 2) + 4 的树状表示。
expr.png
版本 - 1:递归求解
在 eval 函数的 if 中使用类型判断,相比于 Java,不需要再一次进行类型转换。
import java.lang.IllegalArgumentException
interface Expr
class Num(val value:Int) : Expr
class Sum(val left: Expr, val right: Expr): Expr
fun eval(expr: Expr): Int {
if (expr is Sum) {
return eval(expr.left) + eval(expr.right)
}
if (expr is Num) {
return expr.value
}
throw IllegalArgumentException("Unknown expression")
}
fun main() {
// (1 + 2) + 4
val expr = Sum(Sum(Num(1), Num(2)), Num(4))
println(eval(expr))
}
版本 - 2:表达式函数体
将 eval 函数修改成表达式函数体 (Expression Body)。
import java.lang.IllegalArgumentException
interface Expr
class Num(val value:Int) : Expr
class Sum(val left: Expr, val right: Expr): Expr
fun eval(expr: Expr): Int =
if (expr is Sum) {
eval(expr.left) + eval(expr.right)
} else if (expr is Num) {
expr.value
} else {
throw IllegalArgumentException("Unknown expression")
}
fun main() {
// (1 + 2) + 4
val expr = Sum(Sum(Num(1), Num(2)), Num(4))
println(eval(expr))
}
版本 - 3:使用 when
使用 Kotlin 的 when 语法,提高代码清晰度。
import java.lang.IllegalArgumentException
interface Expr
class Num(val value:Int) : Expr
class Sum(val left: Expr, val right: Expr): Expr
fun eval(expr: Expr): Int =
when (expr) {
is Num -> expr.value
is Sum -> eval(expr.left) + eval(expr.right)
else -> throw IllegalArgumentException("Unknown expression")
}
fun main() {
// (1 + 2) + 4
val expr = Sum(Sum(Num(1), Num(2)), Num(4))
println(eval(expr))
}
版本 - 4:消除异常处理
使用 Kotlin 的 sealed class 来消除异常处理。
sealed class Expr
class Num(val value:Int) : Expr()
class Sum(val left: Expr, val right: Expr): Expr()
fun eval(expr: Expr): Int =
when (expr) {
is Num -> expr.value
is Sum -> eval(expr.left) + eval(expr.right)
}
fun main() {
// (1 + 2) + 4
val expr = Sum(Sum(Num(1), Num(2)), Num(4))
println(eval(expr))
}