我阅读了很长时间的文档,但没有完全理解它是如何工作的。
一个内心的声音低声说这两行应该做同样的事情:
private fun makePost(post: Map<String, String>): RequestBody {
val body = FormBody.Builder()
1: post.forEach { (k, v) -> body.add(k, v) }
2: post.forEach { body::add }
return body.build()
}
但他们没有。第一个有效,第二个无效(主体仍然是空的,但也没有错误)
请解释一下我内心的声音在哪里搞砸了,可以(如何?)在这里使用function reference
?
很高兴该版本的一切都很清楚。这是我的解释:
forEach
你的方法Map
对元素进行操作Map.Entry<String, String>
,这String
与方法所需的两个类型参数不同body::add
。但
Kotlin
他没有发誓,而是假装他可以扩展元素,就像他在选项 1 中所做的那样,但有些东西不起作用。我想你可以向他们报告这个错误。至少没有错误或警告,但代码不起作用。
这是此功能实现的链接。
https://youtrack.jetbrains.com/issue/KT-6947
它看起来像是 的一个特定案例
Map
,在新功能的测试中被遗漏了。开发商回应:
将(方法)函数引用传递给函数时,必须使用普通大括号,而不是大括号。
接下来的三行做同样的事情:
请注意,引用的方法必须返回
Unit
,否则它甚至不会编译。如果唯一的参数是 lambda,则可以省略常规括号,只保留大括号(第 1 行和第 2 行)