Kotlin 学习笔记,2020-06-19

上期笔记


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

看了看,没有什么意外,不过有几条想说的。

首先函数最后一个参数如果是 lambda 类型,调用时候有个特殊语法:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*...*/ }

foo(1) { println("hello") }     // Uses the default value baz = 1
foo(qux = { println("hello") }) // Uses both default values bar = 0 and baz = 1 
foo { println("hello") }        // Uses both default values bar = 0 and baz = 1

坦率讲我不太喜欢这个,多一种不同的语法,但没看出来有什么价值,白白增加的复杂。另外中缀调用形式我也觉得加上去得不偿失。最后还要吐槽这个尾递归:浪费一个关键字也就算了,关键是我试了一下,一个完全不能尾递归的函数、甚至完全不是递归的函数也可以加这个 tailrec 关键字,而且编译不报错 —— 这种「单纯是个 hint」的特性,你们在 C++ 历史上苦头还没吃够么?

不过这个设计我还挺喜欢的:如果不是可以用一个表达式表示的函数,必须显示指明返回类型。理由说的很好:函数体如果带控制流逻辑,不论是读代码的人还是编译器推断返回类型可能都有困难。某些语言比如 Haskell,就是在这里走过头了。


https://kotlinlang.org/docs/reference/lambdas.html#higher-order-functions-and-lambdas

没有什么意外的一节。函数最后一个参数是 lambda 时的特殊语法之前应该已经吐槽过了,不过这里给出了一个为什么要支持这个语法的理由:可以写 LINQ-style 的代码!

strings.filter { it.length == 5 }.sortedBy { it }.map { it.toUpperCase() }

首先抄袭 C# 实锤到不能再实锤了,然后 TMD 这个语法和下面这个有多大区别?

strings.filter({ it.length == 5 }).sortedBy({ it }).map({ it.toUpperCase() })

然后也和当年的 C# 一样,创建匿名函数支持两套语法,「lambda 表达式风格」和「匿名函数风格」:

val x = fun(x: Int, y: Int): Int { return x + y }  // 风格一
val y = { x:Int, y: Int -> x + y}  // 风格二

…… 坦率讲当年我就很讨厌 C# 这么做,现在更讨厌了 ……


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

在 JVM 上跑的语言会有这个显示指定 inline 的支持,我便是没想到。更没想到的是还有对应的 noinline ……

但这一节里面介绍的 Reified type parameter 是个有用的特性。2020-06-18 的笔记 里有提到这个关键字,没想到解释在这里(而且为什么会在这里?不应该放泛型那一节吗?)。简单讲就是 Java 风格的泛型中一个让我讨厌了很久的「整天要给泛型函数传 clazz」问题得到了缓解:

fun <T> TreeNode.findParentOfType(clazz: Class<T>): T? {
    var p = parent
    while (p != null && !clazz.isInstance(p)) {
        p = p.parent
    }
    @Suppress("UNCHECKED_CAST")
    return p as T?
}
...
treeNode.findParentOfType(MyTreeNode::class.java)

// 可以变化为

inline fun <reified T> TreeNode.findParentOfType(): T? {
    var p = parent
    while (p != null && p !is T) {
        p = p.parent
    }
    return p as T?
}
...
treeNode.findParentOfType<MyTreeNode>()

这个漂亮多了!但是堵心的是这个特性必须搭配 inline 一起用 …… 好吧从实现角度想了一下,可以理解 …… 但还是很堵心!设计门新语言了都!还非要去学 Java 用 type erasure 做甚!JVM 不提供支持怎么了?自己做 name mangling 搞不定吗?你都在编译器上玩这么多花活了!嗯 …… 好吧二进制分发,我知道了 …………

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