Tim*_*ing 5 generator coroutine kotlin
我正在尝试使用Long前面的单个值生成一个序列LongRange.这有效:
val seq = buildSequence<Long> {
yield(2)
yieldAll(3L..5)
}
Run Code Online (Sandbox Code Playgroud)
但是试图概括它,我似乎无法构建一个我可以成功调用的扩展函数:
infix fun Long.join(R: LongRange): Sequence<Long> {
val start = this
return buildSequence<Long> {
yield(start)
yieldAll(R)
}
}
Run Code Online (Sandbox Code Playgroud)
当我试图打电话时:
(2 join 3..5).forEach { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
我明白了
错误:(26,20)Kotlin:未解决的参考.由于接收器类型不匹配,以下候选者都不适用:公共中缀乐趣Long.join(R:LongRange):在main.kotlin中定义的序列
好像编译器认识到函数的签名接近我想要实现的那个,但我对"接收器类型不匹配"的含义显然很模糊.
在"接收器类型不匹配"的错误意味着什么作为接收器的扩展功能通过(即是什么所谓的)不符合申报接收器类型.
科特林,不像Java的,不提倡的数字更广泛的数字类型,你必须用Long文字在你的代码,其中一个Long预期:
(2L join 3L..5).forEach { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
在这里,使用2接收器不是一种选择,因为a Long是预期的.但是在3L..5使用中5是可以的,因为有一个Long.rangeTo重载接受Int并返回一个LongRange.
当有自动提升时唯一的例外是当你将一个Int文字分配给另一个整数类型的变量时,当你将一个Int文字作为一个参数传递给一个期望另一个整数类型的函数时(如上所述,它不适用于接收器).
val a: Long = 5 // OK
fun f(l: Long) { }
f(5) // OK
val b = 5
val c: Long = b // Error
f(b) // Error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2277 次 |
| 最近记录: |