美文网首页
Kotlin 示例之 Expr

Kotlin 示例之 Expr

作者: 秋雁上海 | 来源:发表于2020-06-25 19:14 被阅读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))
}

相关文章

  • Kotlin 示例之 Expr

    目标 演示 Kotlin 的一些典型用法。 参考 《Kotlin 实战》 Kotlin in Action 问题 ...

  • Shell expr 命令使用示例

    expr 命令是一个用于对表达式进行求值并输出相应结果的命令行工具。它同样只支持整数运算,不支持浮点运算。 与 l...

  • Kotlin 示例

    介绍 Hello World kotlin应用的入口是main方法。 函数 简单的函数,参数为String类型,返...

  • MySQL日期和时间函数

    # MySQL日期和时间函数 - ADDDATE(EXPR, DAYS) 含义:向日期加上指定的天数 示例: SE...

  • Kotlin之美——DSL篇

    Kotlin 系列:Kotlin之美——高效篇Kotlin之美——DSL篇 Kotlin DSL 把 Kotlin...

  • Kotlin之美——高效篇

    Kotlin 系列:Kotlin之美——高效篇Kotlin之美——DSL篇 Kotlin 作为后起之秀,站在巨人们...

  • kotlin入门潜修系列教程

    kotlin入门潜修之开门篇—kotlin是什么? kotlin入门潜修之基础篇—基础语法kotlin入门潜修之基...

  • 26.Kotlin与Java互操作

    Kotlin与Java互操作 在Kotlin中操作Java 示例代码:Person类 在Java中,所有引用都可能...

  • && || !

    !expr 对 expr 求反 expr1 && expr2 对 expr1 与 expr2 求逻辑与, 当 ex...

  • Flutter 学习从零开始-Dart运算符

    描述运算符一元后缀expr++ expr-- () [] . ?.一元前缀-expr !expr ~expr ++...

网友评论

      本文标题:Kotlin 示例之 Expr

      本文链接:https://www.haomeiwen.com/subject/hazsfktx.html