【发布时间】:2018-04-21 05:35:10
【问题描述】:
部分函数应用程序的语法有问题。以下代码运行良好,并输出:two-three-four
import kotlin.coroutines.experimental.*
inline fun <T> Iterable<T>.forEachFrom(beg:Int, act:(T)->Unit) {
var i=0; if (beg>=0) for (e in this) if (i++ >= beg) act(e)
} // sample function I am testing; please don't change this!
fun main(a:Array<String>) {
val l = listOf("zero", "one", "two", "three", "four")
fun test() = buildSequence { l.forEachFrom(2) { yield(it) } }.joinToString("-")
println(test())
}
我想封装我的test(),所以它被称为:
test(l.forEachFrom(2)) 但是,我似乎无法正确理解类型/语法。
我将如何重写 test() 函数定义以实现这一点?
【问题讨论】:
-
但是你的
act返回Unit,那yield怎么可能收集到东西? -
在您的情况下,阻止我找到简单解决方案的最大问题是 Kotlin 协程只能从内联的高阶函数执行挂起调用,因此您不能只创建部分应用的函数通过编写一个与最后一个参数一起工作的 lambda 并在那里传递
{ yield(it) }:编译器需要你传递它的地方是一个内联函数。 -
@hotkey Inline 对于这些测试过程可能没问题,但我仍然不确定该语法会是什么样子。我试过了,但我认为我仍然没有得到正确的类型。如果所有内容都被内联,你能告诉我语法会是什么样子吗?
标签: kotlin partial-application