在您的示例中,combine 是 (b: String) -> String 类型的参数,该函数采用单个 String 并返回 String。
(其实你不需要将参数命名为b,可以直接写成(String) -> String。)
将函数作为参数传递的主要方式有以下三种:
-
作为lambda。 这可能是最常见的:您直接在大括号中提供函数体。例如:
val test1 = test0(a, { it })
这里的 lambda 是 { it }。 (it 是您可以在 lambdas 中使用的关键字,它采用单个参数,并引用该参数。 等效的可能是 { a -> a }。)
事实上,因为函数参数是最后一个参数,Kotlin 允许你将 lambda 移到括号之后:
val test1 = test0(a){ it }
这意味着完全相同,但在某些情况下它可以更好地阅读(通过使函数调用看起来像语言语法;像 map 和 filter 这样的函数通常以这种方式调用)。
-
作为anonymous function。 这类似于 lambda,但语法更像是定义一个普通函数;它更冗长,但给你更多的控制权。在这种情况下,您可以使用普通的函数体:
val test2 = test0(a, fun(b: String): String { return b })
或表达式体:
val test2 = test0(a, fun(b: String) = b)
-
作为callable reference。 当您有想要使用的现有方法或功能时。 (您的项目或库中可能已经有合适的函数;或者代码可能太长而无法整齐地放入 lambda。)
使用:: 运算符完成,例如:
val test3 = test0(a, ::getFold)
您可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。 (如果它不是顶级函数,您可能需要告诉编译器它属于哪个对象/类——就像直接调用它时一样——例如myInstance::methodName。)
看起来这就是问题中的代码试图做的事情。但是,lambda 语法通常更简单、更清晰,因此如果出于任何其他原因不需要现有函数,请考虑一下。
(问题中的错误信息是因为combine = getFold(a)会调用getFold(),并尝试将其结果分配给combine参数。 那个结果是字符串,而不是函数类型,因此类型不匹配。)