Kotlin 核心编程 (37):基础语法 2.4.6

阅读数:2 2019 年 12 月 25 日 15:34

Kotlin核心编程(37):基础语法 2.4.6

(中缀表达式)

内容简介
本书不是一本简单介绍 Kotlin 语法应用的图书,而是一部专注于帮助读者深入理解 Kotlin 的设计理念,指导读者实现 Kotlin 高层次开发的实战型著作。书中深入介绍了 Kotlin 的核心语言特性、设计模式、函数式编程、异步开发等内容,并以 Android 和 Web 两个平台为背景,演示了 Kotlin 的实战应用。
全书共 13 章,分为 4 个部分:
热身篇—Kotlin 基础(第 1~2 章),简单介绍了 Kotlin 设计哲学、生态及基础语法,其中包括 Kotlin 与 Scala、Java 之间的关联与对比,以及 Kotlin 的类型声明的特殊性、val 和 var 的使用、高阶函数的使用、面向表达式编程的使用、字符串的定义与操作等内容;
下水篇—Kotlin 核心(第 3~8 章),深入介绍了面向对象、代数数据类型、模式匹配、类型系统、Lambda、集合、多态、扩展、元编程等 Kotlin 开发核心知识,这是本书的重点,其中涉及很多开发者特别关心的问题,比如多继承问题、模式匹配问题、用代数数据类型抽象业务问题、泛型问题、反射问题等。
潜入篇—Kotlin 探索(第 9~11 章),探索 Kotlin 在设计模式、函数式编程、异步和并发等编程领域的应用,其中包括对 4 大类设计模式、Typeclass 实现、函数式通用结构设计、类型替代异常处理、共享资源控制、CQRS 架构等重点内容的深入剖析;
遨游篇—Kotlin 实战(第 12~13 章),着重演示了 Kotlin 在 Android 和 Web 平台的实战案例,其中涉及架构方式、单向数据流模型、解耦视图导航、响应式编程、Spring 5 响应式框架和编程等内容。

本节中,我们已经见识了不少 Kotlin 中奇特的方法,如 in、step、downTo、until,它们可以不通过点号,而是通过中缀表达式来被调用,从而让语法变得更加简洁直观。那么,这是如何实现的呢?

先来看看 Kotlin 标准库中另一个类似的方法 to 的设计,这是一个通过泛型实现的方法,可以返回一个 Pair。

复制代码
infix fun <A, B> A.to(that: B): Pair<A, B>

在 Kotlin 中,to 这种形式定义的函数被称为中缀函数。一个中缀函数的表达形式非常简单,我们可以理解成这样:

复制代码
A 中缀方法 B

不难发现,如果我们要定义一个中缀函数,它必须需满足以下条件:

  • 该中缀函数必须是某个类型的扩展函数或者成员方法;
  • 该中缀函数只能有一个参数;
  • 虽然 Kotlin 的函数参数支持默认值,但中缀函数的参数不能有默认值,否则以上形式的 B 会缺失,从而对中缀表达式的语义造成破坏;
  • 同样,该参数也不能是可变参数,因为我们需要保持参数数量始终为 1 个。

函数可变参数
Kotlin 通过 varargs 关键字来定义函数中的可变参数,类似 Java 中的“…”的效果。需要注意的是,Java 中的可变参数必须是最后一个参数,Kotlin 中没有这个限制,但两者都可以在函数体中以数组的方式来使用可变参数变量,正如以下例子:

复制代码
fun printLetters(vararg letters: String, count: Int): Unit {
print("${count} letters are ")
for (letter in letters) print(letter)
}
>>> printLetters("a", "b", "c", count = 3)
3 letters are abc

此外,我们可以使用 *(星号)来传入外部的变量作为可变参数的变量,改写如下:

复制代码
val letters = arrayOf("a", "b", "c")
>>> printLetters(*letters, count = 3)
3 letters are abc

由于 to 会返回 Pair 这种键值对的结构数据,因此我们经常会把它与 map 结合在一起使用。如以下例子:

复制代码
mapOf(
1 to "one",
2 to "two",
3 to "three"
)

可以发现,中缀表达式的方式非常自然。接下来,我们再来自定义一个中缀函数,它是类 Person 中的一个成员方法:

复制代码
class Person {
infix fun called(name: String) {
println("My name is ${name}.")
}
}

因为 called 方法用 infix 进行了修饰,所以我们可以这样调用它:

复制代码
fun main(args: Array<String>) {
val p = Person()
p called "Shaw"
}
// 运行结果
My name is Shaw.

需要注意的是,Kotlin 仍然支持使用普通方法的语法习惯来调用一个中缀函数。如这样来执行 called 方法:

复制代码
p.called("Shaw")

然而,由于中缀表达式在形式上更像自然语言,所以之前的语法要显得更加的优雅。

Kotlin核心编程(37):基础语法 2.4.6

购书地址 https://item.jd.com/12519581.html?dist=jd

评论

发布