【100 种语言速成】第 5 节:Kotlin

2022-05-13 14:07:26 浏览数 (1)

Kotlin 之于 Java 就像 ES6 之于旧式 JavaScript。很多人都被 JavaScript 引擎(如浏览器)或 JVM(如 Android)所困。他们的母语很糟糕,但是使用完全非母语的语言会导致与本地 API 交互的巨大复杂性。于是就创建了折衷的解决方案,比如用于 JavaScript 的 ES6 和用于 Java 的 Kotlin。Kotlin 在 Android 开发人员中特别受欢迎,但你可以在任何可以使用 JVM 的地方使用它,而且现在真的很难找到使用“纯 Java”的正当理由。

Hello, World

我们可以从最基本的程序开始!这没什么不寻常的,除非你记得它在普通 Java 中有多糟糕:

代码语言:javascript复制
fun main() {
  println("Hello, World!")
}

对于一个合理的 hello world,整个事件花费的时间太长了:

代码语言:javascript复制
$ kotlinc hello.kt -include-runtime -d hello.jar && java -jar hello.jar

Kotlin 有某种“脚本模式”和 REPL,它可以与你的 IDE 集成,所以对于每天编写它的人来说,这可能不是问题。

我在代码库中包含了一个允许 ./run file.kt 的简短脚本。

斐波那契

我们需要一些类型注释,感觉它们应该是可推断的,但它们都是完全合理的代码。范围循环语法是完全可读的,总体而言,考虑到它基本上是 Java 底层,它的可读性和简洁的代码令人震惊。

代码语言:javascript复制
fun fib(n: Int): Int {
  if (n < 3) {
    return 1
  } else {
    return fib(n - 1)   fib(n - 2)
  }
}

fun main() {
  for (i in 1..30) {
    println(fib(i))
  }
}

FizzBuzz

Kotlin 抛弃了 C 风格 switch,引入了 when 语法,这有点类似于 Haskell 风格的模式匹配。

代码语言:javascript复制
fun fizzbuzz(n: Int): String {
  return when {
    n % 15 == 0 -> "FizzBuzz"
    n % 3 == 0 -> "Fizz"
    n % 5 == 0 -> "Buzz"
    else -> n.toString()
  }
}

fun main() {
  for (i in 1..100) {
    println(fizzbuzz(i))
  }
}

统一码

由于 Kotlin 在底层基本上就是 Java,它仍然不能在基本平面之外正确处理 Unicode,所以最后一个答案是错误的:

代码语言:javascript复制
fun main() {
  println("Hello".length)
  println("Źółw".length)
  println("


	

0 人点赞