美文网首页
Kotlin 区间 原理

Kotlin 区间 原理

作者: 莫库施勒 | 来源:发表于2019-05-23 11:54 被阅读0次

    直接上代码, 我们以下面的例子说明

    for (i in 4 downTo 1 step 2) print(i) // 输出“42”
    
    // downTo 定义
    public infix fun Int.downTo(to: Int): IntProgression {
        return IntProgression.fromClosedRange(this, to, -1)
    }
    
    
    // until 定义
    public infix fun Int.until(to: Int): IntRange {
        if (to <= Int.MIN_VALUE) return IntRange.EMPTY
        return this .. (to - 1).toInt()  // 此处可以看出 .. 与 until 的区别
    }
    // LongRange 定义
    public class LongRange(start: Long, endInclusive: Long) : LongProgression(start, endInclusive, 1), ClosedRange<Long> {
        override val start: Long get() = first
        override val endInclusive: Long get() = last
    
        override fun contains(value: Long): Boolean = first <= value && value <= last
    
        override fun isEmpty(): Boolean = first > last
    
        override fun equals(other: Any?): Boolean =
            other is LongRange && (isEmpty() && other.isEmpty() ||
            first == other.first && last == other.last)
    
        override fun hashCode(): Int =
            if (isEmpty()) -1 else (31 * (first xor (first ushr 32)) + (last xor (last ushr 32))).toInt()
    
        override fun toString(): String = "$first..$last"
    
        companion object {
            /** An empty range of values of type Long. */
            public val EMPTY: LongRange = LongRange(1, 0)
        }
    }
    
    // LongProgression 定义
     public open class LongProgression
        internal constructor
        (
                start: Long,
                endInclusive: Long,
                step: Long
        ) : Iterable<Long> {... }
    
    // ClosedRange 定义
    public interface ClosedRange<T: Comparable<T>> {
        /**
         * The minimum value in the range.
         */
        public val start: T
    
        /**
         * The maximum value in the range (inclusive).
         */
        public val endInclusive: T
    
        /**
         * Checks whether the specified [value] belongs to the range.
         */
        public operator fun contains(value: T): Boolean = value >= start && value <= endInclusive
    
        /**
         * Checks whether the range is empty.
         */
        public fun isEmpty(): Boolean = start > endInclusive
    }
    
    public infix fun IntProgression.step(step: Int): IntProgression {
        checkStepIsPositive(step > 0, step)
        return IntProgression.fromClosedRange(first, last, if (this.step > 0) step else -step)
    }
    
    

    其中 infix 表示中缀表示法, operator 表示 重载操作符的函数

    infix fun Int.shl(x: Int): Int { …… }
    
    // 用中缀表示法调用该函数
    1 shl 2
    
    // 等同于这样
    1.shl(2)
    

    相关文章

      网友评论

          本文标题:Kotlin 区间 原理

          本文链接:https://www.haomeiwen.com/subject/mgjvzqtx.html