代码之家  ›  专栏  ›  技术社区  ›  ligi

Kotlin将uint用于数组访问和常量

  •  4
  • ligi  · 技术社区  · 6 年前

    无符号数据类型可以很好地用于数组访问。通常索引都是无符号的。但目前我不能直接这么做。例如,此代码。

    val foo = 1.toUInt()
    
    "foo"[foo]
    

    编译失败:

    error: type mismatch: inferred type is UInt but Int was expected
    

    最好的方法是什么?当然可以:

    val foo = 1.toUInt()
    
    "foo"[foo.toInt()]
    

    但不知怎么的,这感觉是错误的。不管怎样,uint是一个内联类,并且会被擦除为int,所以我认为不需要这样做。有没有人看到过这种小东西? 还想知道如何定义无符号常量。不幸的是,构造函数是私有的,所以我不能这样做,例如

    const val foo = UInt(42)
    

    const val foo = 42.toUInt()
    

    失败了 42.toUInt() 不是常量值

    2 回复  |  直到 6 年前
        1
  •  3
  •   gidds    6 年前

    除非/直到有内置的支持,否则您可以自己添加它。例如,对于标准数组:

    operator fun <T> Array<T>.get(index: UInt) = this[index.toInt()]
    

    为了 CharSequence s(不是数组):

    operator fun CharSequence.get(index: UInt) = this[index.toInt()]
    

    在这个范围内, "foo"[foo] 工作很好!

    (您还需要为 IntArray &C如果您使用这些。)

        2
  •  3
  •   Nick Johnson    6 年前

    在数组索引问题中, .toInt() 是我找到的最好的方法。

    声明一个常量,您可以将“u”附加到任何整数常量,或者将“ul”附加到一个长常量,比如 42u 1_000_000_000_000uL .