如何将函数传递给Kotlin中的数据类?

时间:2018-03-11 23:16:56

标签: function kotlin

当我在kotlin playground中运行以下内容时,它会输出错误,没有别的。以下代码有什么问题?这很简单,我将一个函数作为其中一个初始化参数传递给数据类,然后在数据类实例上调用此函数。不允许将函数传递给Kotlin中的数据类吗?

data class Person(val name: String,
                  val age: Int = 0,
                  val showMsg : (msg: String) -> Unit)


fun main(args: Array<String>) {
    val p = Person(name="Bob", age=29, {msg -> println(msg)})
    p.showMsg("Hello, world!")
}

4 个答案:

答案 0 :(得分:7)

其他答案中解决方案的可行替代方法是将最后一个参数lambda传递给括号外。

如果函数将另一个函数作为最后一个参数,则lambda表达式参数可以在带括号的参数列表之外传递。在这种情况下,您不需要为其使用命名参数:

val p = Person(name = "Bob", age = 29) { println(it) }

答案 1 :(得分:3)

您不能混合命名和定位参数。使用

fun main(args: Array<String>) {
    val p = Person(name="Bob", age=29, showMsg = {msg -> println(msg)})
    p.showMsg("Hello, world!")
}

fun main(args: Array<String>) {
    val p = Person("Bob", 29, {msg -> println(msg)})
    p.showMsg("Hello, world!")
}

答案 2 :(得分:3)

您不能为2个参数使用命名参数并忽略最后一个参数(lambda / function参数),您只需要按如下方式命名最后一个参数。

val p = Person(name="Bob", age=29, showMsg = {msg -> println(msg)})

答案 3 :(得分:2)

这对我来说很好;

data class Person(val name: String,
                  val age: Int = 0,
                  val showMsg : (String) -> Unit
)

val p = Person(name="Bob", age=29, showMsg = ::println)
p.showMsg("Hello, world!")