Kotlin使用UInt进行数组访问和常量

问题描述 投票:4回答:2

无符号数据类型可能适合数组访问。通常索引都是无符号的。但目前我不能直接这样做。例如。这段代码。

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()不是一个恒定的值

kotlin unsigned
2个回答
3
投票

除非/直到内置对此的支持,否则您可以轻松地自行添加。例如,对于标准数组:

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

对于CharSequences(不是数组):

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

有了这个范围,你的"foo"[foo]工作正常!

(如果你使用那些,你还需要IntArray和c的单独重载。)


3
投票

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

声明一个const,你可以将“u”附加到任何整数常量,或者将“uL”附加到长常量,如42u1_000_000_000_000uL

© www.soinside.com 2019 - 2024. All rights reserved.