我试图使用以下代码片段在BigInteger
上循环Kotlin
值。但它告诉For-loop range must have an 'iterator()' method
。如何在BigInteger
中循环Kotlin
值?
private fun pow(base: BigInteger, power: BigInteger): String {
for(i in BigInteger.ZERO..power){ //Giving error
}
}
您可以扩展BigInteger
以允许此操作
特别是我们需要:
rangeTo
函数引入BigInteger
(允许使用..
operator
)iterator
函数添加到rangeTo
operator
返回的范围内rangeTo
功能
在这里,我为extension function定义了一个BigInteger
operator fun BigInteger.rangeTo(other: BigInteger) =
BigIntegerRange(this, other)
BigIntegerRange
:
class BigIntegerRange(
override val start: BigInteger,
override val endInclusive: BigInteger
) : ClosedRange<BigInteger>, Iterable<BigInteger> {
override operator fun iterator(): Iterator<BigInteger> =
BigIntegerRangeIterator(this)
}
BigIntegerRangeIterator
:
class BigIntegerRangeIterator(
private val range: ClosedRange<BigInteger>
) : Iterator<BigInteger> {
private var current = range.start
override fun hasNext(): Boolean =
current <= range.endInclusive
override fun next(): BigInteger {
if (!hasNext()) {
throw NoSuchElementException()
}
return current++
}
}
现在这段代码:
fun main() {
for (i in BigInteger.ZERO..BigInteger.TEN) {
println(i)
}
}
编译和打印:
0
1
2
3
4
5
6
7
8
9
10
不要忘记import
rangeTo
功能
也可以看看: