Kotlin 学习笔记,2020-06-23

上期笔记


原本按照次序,这一波应该看 coroutine 相关的内容。不过考虑到这个东西对我近期的应用场景无关,所以跳过直接上 more language constructs 这一节了。


https://kotlinlang.org/docs/reference/multi-declarations.html#destructuring-declarations

这是个好东西,配合 data class 食用风味上佳。

data class Result(val result: Int, val status: Status)
fun function(...): Result {
    // computations
    
    return Result(result, status)
}

// Now, to use this function:
val (result, status) = function(...)

https://kotlinlang.org/docs/reference/typecasts.html#type-checks-and-casts-is-and-as

Kotlin 在 type cast 上还是做了些工作的,当然这边多数内容在 introduction 那一节已经介绍过了。这边值得一提是 Kotlin 在 type erasure 的限制下做了一些努力:

inline fun <reified T> List<*>.asListOfType(): List<T>? =
    if (all { it is T })
        @Suppress("UNCHECKED_CAST")
        this as List<T> else
        null

这个函数挺有用。运行时虽然不知道这个 List<*> 的类型参数是啥,但是可以用一个检查来安全的 cast 成 List<T>,省掉了一些 Java 中必须用 clazz<T> 来做的 trick。


https://kotlinlang.org/docs/reference/this-expressions.html#this-expression

意料之中。


https://kotlinlang.org/docs/reference/equality.html#equality

意料之中,== 代表 equals=== 代表引用同一个对象。另外浮点数的判等还是坑。


https://kotlinlang.org/docs/reference/operator-overloading.html#operator-overloading

运算符重载的设计中规中矩。一个特定的运算符式子映射到一个特定的函数调用,确实清楚。

a + b => a.plus(b)

https://kotlinlang.org/docs/reference/null-safety.html#null-safety

利用类型系统避免 NPE 的思路是对的。然后这个链式调用的语法糖我喜欢:val name = bob?.department?.head?.name


https://kotlinlang.org/docs/reference/exceptions.html#exceptions

异常方面,try / catch 可以当表达式用:

val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }

另外取消了 checkedException 这事真是大快人心。

这边也解释了一下为什么要引入 Nothing,基本说法是这玩意用来标记不可到达的代码位置。比如说一个函数总是抛异常而不返回,它的返回值类型就是 Nothing。这个有一定道理,相较于返回 Unit 类型、也就是正常返回但是并不返回有意义的值的函数,这两种情况语义上是有微妙差别的。当然这个设计是不是划算,感觉也很难说。


https://kotlinlang.org/docs/reference/annotations.html#annotations

没啥可说的,基本和 Java 的设计一致。


https://kotlinlang.org/docs/reference/reflection.html#reflection

很意外的是没有看到 forName 之类的操作。反射不支持这个?太奇怪了。


https://kotlinlang.org/docs/reference/scope-functions.html#scope-functions

这个我是真不太明白 Kotlin 设计者的脑回路 …… 下面两段代码有啥区别?为啥非要说前一段「more concise and readable?」

Person("Alice", 20, "Amsterdam").let {
    println(it)
    it.moveTo("London")
    it.incrementAge()
    println(it)
}
// 对比
val alice = Person("Alice", 20, "Amsterdam")
println(alice)
alice.moveTo("London")
alice.incrementAge()
println(alice)

表示对这个特性实在喜欢不起来。能删掉的话,我投一票。


https://kotlinlang.org/docs/reference/type-safe-builders.html#type-safe-builders

这个有点意思。文档给出的例子代码值得一看:

import com.example.html.* // see declarations below

fun result() =
    html {
        head {
            title {+"XML encoding with Kotlin"}
        }
        body {
            h1 {+"XML encoding with Kotlin"}
            p  {+"this format can be used as an alternative markup to XML"}

            // an element with attributes and text content
            a(href = "http://kotlinlang.org") {+"Kotlin"}

            // mixed content
            p {
                +"This is some"
                b {+"mixed"}
                +"text. For more see the"
                a(href = "http://kotlinlang.org") {+"Kotlin"}
                +"project"
            }
            p {+"some text"}

            // content generated by
            p {
                for (arg in args)
                    +arg
            }
        }
    }

学过 Kotlin 中以 lambda 表达式为参数的函数调用语法和运算符重载语法之后,这个例子其实不难看懂。但效果确实有点小惊艳。这个地方看,Kotlin 对实现 DSL 确实是下了功夫的。这里也得说一句,之前我对「以 lambda 表达式为参数的函数调用语法有特殊处理」这个设计颇有微词,吐槽过两次没价值。放到这里来看,却是「特殊」得正好,也不知道是有意设计的还是无心插柳。总之之前的抱怨看来要收回了,:P


https://kotlinlang.org/docs/reference/opt-in-requirements.html#opt-in-requirements

这个感觉不太重要,跳过了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352