如何理解 Kotlin 中有趣的 buildString(builderAction: (StringBuilder) -> Unit) : String ?

Hel*_*oCW 3 android kotlin

以下代码来自https://github.com/gbaldeck/learning-kotlin/blob/master/src/main/kotlin/org/learning/DSLconstruction.kt

我觉得很难理解。

1:fun buildStringA节中只接受一个lambda参数,为什么B节中传递了两个参数?

2:B节的完整代码是什么?
例如

 val s = buildString { aa : StringBuild -> aa.append("Hello.") } // I don't know whether it's right? 
Run Code Online (Sandbox Code Playgroud)

it3: B 部分是什么?这是否it代表StringBuild

A部分

fun buildString(builderAction: (StringBuilder) -> Unit ) : String {
    val sb = StringBuilder()
    builderAction(sb)
    return sb.toString()
}
Run Code Online (Sandbox Code Playgroud)

B部分

val s = buildString {
    it.append("Hello, ")
    it.append("World!")
}

logError(s)  //The result is Hello, World!
Run Code Online (Sandbox Code Playgroud)

Epi*_*rce 5

1:fun buildString在A节中只接受一个lambda参数,为什么B节中传递了两个参数?

只有 1 个参数传递给该函数:具体来说,是builderActionof 类型(StringBuilder) -> Unit

所以

val s = buildString {
    it.append("Hello, ")
    it.append("World!")
}
Run Code Online (Sandbox Code Playgroud)

相当于

val s: String = buildString(builderAction = { stringBuilder: StringBuilder ->
    stringBuilder.append("Hello, ")
    stringBuilder.append("World!")
    // return Unit
})
Run Code Online (Sandbox Code Playgroud)

Meaningit实际上是 的未命名的单个参数(StringBuilder) -> Unit,所以它是一个StringBuilder.