Kotlin использует UInt для доступа к массиву и константу - PullRequest
0 голосов
/ 09 февраля 2019

беззнаковые типы данных могут быть удобны для доступа к массиву.Обычно индексы в любом случае не подписаны.Но в настоящее время я не могу сделать это напрямую.Например, этот код.

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() не является постоянным значением

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Если / пока нет встроенной поддержки, вы можете легко добавить ее самостоятельно.Например, для стандартных массивов:

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, если вы их использовали.)

0 голосов
/ 09 февраля 2019

В вопросе индексации массива, .toInt() - лучший метод, который я нашел.

Объявляя const, вы можете добавить «u» к любой целочисленной константе или «uL» для длинной константывроде 42u или 1_000_000_000_000uL.

...