1、类定义
interface Expr {}
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
2、if语句实现类型判断
fun eval(e: Expr): Int {
if (e is Num) {
val n = e as Num
return n.value
}
if (e is Sum) {
return eval(e.left) + eval(e.right)
}
throw IllegalArgumentException("Unkown exception")
}
3、when语句优化
fun eval(e: Expr): Int {
return when (e) {
is Num -> e.value
is Sum -> eval(e.left) + eval(e.right)
else -> throw IllegalArgumentException("Unkown expression")
}
}
4、带日志的when语句
fun evalWithLogging(e: Expr): Int =
when (e) {
is Num -> {
println("num:${e.value}")
e.value
}
is Sum -> {
val left = evalWithLogging(e.left)
val right = evalWithLogging(e.right)
println("sum: $left + $right")
left + right
}
else -> throw IllegalArgumentException("Unknown expression")
}
5、测试
fun main(args: Array<String>) {
val sum = Sum(Sum(Num(1), Num(2)), Num(4));
println(sum)
println(eval(sum))
}