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))
}
上一篇下一篇

猜你喜欢

热点阅读