对 kotlin 中的 -> 有疑问。
\n fun test0 (a: String, combine: (b: String) -> String ): String {\n return combine(a)\n }\nRun Code Online (Sandbox Code Playgroud)\n上面有一个示例函数,如何使用这个函数?\n我不知道如何传递 parm 组合。
\n已尝试遵循:
\n private fun getFold(a: String): String {\n return a\n }\n\n fun test() {\n var a: String = "a"\n val test1 = test0 (a, combine = getFold(a))\n }\nRun Code Online (Sandbox Code Playgroud)\nmerge = getFold(a)) 中的同步错误,例如:
\n类型不匹配。必需:(字符串)\xe2\x86\x92 找到字符串:字符串
\n那么如何传递 parm 组合呢?
\n在您的示例中,combine是 类型的参数(b: String) -> String,它是一个采用单个值String并返回 的函数String。
(事实上,您不需要命名参数b;可以简单地编写它(String) -> String。)
将函数作为参数传递的主要方式有以下三种:
\nval test1 = test0(a, { it })\nRun Code Online (Sandbox Code Playgroud)\n这里的 lambda 是{ it }.\xe2\x80\x82(it是一个可以在带有单个参数的 lambda 中使用的关键字,并引用该参数。\xe2\x80\x82 等效的可能是{ a -> a }。)
事实上,因为函数参数是最后一个参数,Kotlin 允许您将 lambda 移到括号后面:
\nval test1 = test0(a){ it }\nRun Code Online (Sandbox Code Playgroud)\n这意味着完全相同,但在某些情况下它可以更好地阅读(通过使函数调用看起来像语言语法;像map和一样的函数filter通常以这种方式调用)。
val test2 = test0(a, fun(b: String): String { return b })\nRun Code Online (Sandbox Code Playgroud)\n或者一个表达式体:
\nval test2 = test0(a, fun(b: String) = b)\nRun Code Online (Sandbox Code Playgroud)\n这是使用::运算符完成的,例如:
val test3 = test0(a, ::getFold)\nRun Code Online (Sandbox Code Playgroud)\n您可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。\xe2\x80\x82(如果不是顶级函数,您可能需要告诉编译器是哪个对象/class 它属于 \xe2\x80\x94 就像直接调用它时 \xe2\x80\x94 例如myInstance::methodName。)
看起来这就是问题中的代码试图执行的操作。\xe2\x80\x82但是,lambda 语法通常更简单、更清晰,因此请考虑如果您出于任何其他原因不需要现有函数。
\n(问题中的错误消息是因为combine = getFold(a)will call getFold(),并尝试将其结果分配给combine参数。\xe2\x80\x82该结果是一个字符串,而不是函数类型,因此类型不匹配。)
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |