无符号数据类型可能适合数组访问。通常索引都是无符号的。但目前我不能直接这样做。例如。这段代码。
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 - 所以我认为不应该这样做。有人看过kotlin / KEEP吗?还想知道如何定义无符号常量。不幸的是,构造函数是私有的,所以我不能做到,例如
const val foo = UInt(42)
和
const val foo = 42.toUInt()
失败的42.toUInt()
不是一个恒定的值
除非/直到内置对此的支持,否则您可以轻松地自行添加。例如,对于标准数组:
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的单独重载。)
在数组索引问题中,.toInt()
是我找到的最好的方法。
声明一个const,你可以将“u”附加到任何整数常量,或者将“uL”附加到长常量,如42u
或1_000_000_000_000uL
。