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

时间:2018-08-01 00:54:59

标签: android kotlin

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

很难理解

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

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

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

3:B部分中的 it 是什么?此 it 代表StringBuild吗?

A部分

fun buildString( builderAction: (StringBuilder) -> Unit ): String {
        val sb = StringBuilder()
        builderAction(sb)
        return sb.toString()
}

B部分

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

logError(s)  //The result is Hello, World!

3 个答案:

答案 0 :(得分:1)

是的,itStringBuilder。默认情况下,它的名称为it。您可以根据需要指定名称。

buildString {
     it.append("...")
}

相同
buildString { it ->
    it.append("...")
}

甚至

buildString { myNewString -> 
    myNewString.append("...")
}

答案 1 :(得分:1)

  1. 在B节中仅传递一个参数,即该参数:

    {
        it.append("Hello, ")
        it.append("World!")
    }
    

    那是一个 lambda表达式,而不是两个。 lambda表达式有2个,但它仍然是一个lambda。

  2. 如果要将通话扩展到buildString

    val builder = StringBuilder()
    builder.append("Hello, ")
    builder.append("World!")
    val s = builder.toString()
    
  3. 是的,it是指StringBuilder中的sb buildString。如果函数类型只有一个参数,则可以在lambda表达式中使用it引用单个参数,而无需为其命名。

答案 2 :(得分:1)

  

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

只有1个参数传递给该函数:具体地说,类型为builderAction的{​​{1}}。

所以

(StringBuilder) -> Unit

等同于

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

含义val s: String = buildString(builderAction = { stringBuilder: StringBuilder -> stringBuilder.append("Hello, ") stringBuilder.append("World!") // return Unit }) 实际上是it的未命名单个参数,因此它是(StringBuilder) -> Unit