在 Kotlin 中,函数名称后面的大括号是什么意思?

Xue*_*ang 5 kotlin android-jetpack-compose

Kotlin 初学者:我正在查看 Jetpack Compose 教程,并且遇到了以下代码片段:

@Composable
fun MessageCard(msg: Message) {
    Column {
        Text(text = msg.author)
        Text(text = msg.body)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果Column是一个函数名,没有“()”但有{}怎么调用呢?我希望它像 Text 函数一样被调用。

我尝试将 Column 视为对象或代码块名称,但这都没有意义。

Sim*_*obs 8

Column是一个接受单个参数的函数,该参数是一个 lambda 函数,其中某个对象(Receiver例如调用它)作为接收者。

Column将在代码中的某个位置定义如下:

fun Column(exec: Receiver.() -> Unit) {
   // Code to run the Column function
   // This will create or otherwise obtain an object of type Receiver
   //  and execute `exec` in its scope
}
Run Code Online (Sandbox Code Playgroud)

我建议使用您的 IDE 查找其定义,以便您可以进一步了解发生了什么。

在 Kotlin 中,lambda 是在大括号内定义的。Kotlin 允许使用简写表示法,当最后一个参数是 lambda 函数时,可以省略用于调用函数的普通括号,并且您的示例中正在使用该表示法。同样你可以写:

Column({
   Text(text = msg.author)
   Text(text = msg.body)
})
Run Code Online (Sandbox Code Playgroud)

但为了清晰起见并符合约定,您的 IDE 可能会建议您删除外括号。

Receiver是一种公开函数的类型Text,允许您Text在传递给 的 lambda 函数内进行调用Column。因此Receiver将被定义为:

class Receiver {
   fun Text(text: String) {
      // Do something with the text, probably saving it within Receiver
      //  for later processing when `Column` is called
   }
}
Run Code Online (Sandbox Code Playgroud)


Dol*_*boy -3

这里 Column {} 是您调用的函数,但您可以将其视为一个容器。您可以将要放置在列中的元素放入其中。如果需要,您可以将其视为 HTML 中的容器。你可以这样做:

@Composable
fun ArtistCard() {
    Column {
        Text("Alfred Sisley")
        Text("3 minutes ago")
        Row {
            Text("Alfred Sisley")
            Text("3 minutes ago")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它会显示类似以下内容:

阿尔弗莱德·西斯莱

3 分钟前

阿尔弗雷德·西斯莱 3 分钟前

您可以在此处阅读该文档