У меня есть две переменные, и я хочу присвоить обеим переменным одно и то же значение, как показано ниже:
var allGood: Boolean = false
val deviceId: String = "3550200583"
var isValidId: Boolean = false
allGood = isValidId = deviceId.length > 0 && deviceId.length <= 16
есть ли способ добиться этого?
Поскольку присваивание не является выражением в Kotlin, вы не можете выполнять множественные присваивания таким образом. Но есть и другие способы. Самое очевидное просто:
isValidId = deviceId.length > 0 && deviceId.length <= 16
allGood = isValidId
Более идиоматический (если дольше) способ:
(deviceId.length > 0 && deviceId.length <= 16).let {
allGood = it
isValidId = it
}
(Кстати, можно упростить условие до deviceId.length in 1..16
.)
Есть несколько причин, по которым Kotlin этого не позволяет. Главный из них является, что он несовместим с синтаксисом вызова функции с именованными параметрами: fn(paramName = value)
. Но это также позволяет избежать путаницы между =
и ==
(что в противном случае может привести к трудно обнаруживаемым ошибкам). См. также здесь.
Я не думаю, что второй способ более идиоматичен, чем первый.
Другой способ - сделать это следующим образом:
val deviceId: String = "3550200583";
val condition = deviceId.length > 0 && deviceId.length <= 16
var (allGood, isValidId) = arrayOf(condition, condition);
Зная об этом синтаксисе. Не помогает в моем случае. Спасибо.
Что о:
var allGood: Boolean = false
val deviceId: String = ...
val isValidId: Boolean = (deviceId.length in 1..16).also { allGood = it }
.also
позволяет выполнять дополнительные операции со значением, которое он получает, а затем возвращает исходное значение.
Лучший вариант для этого варианта использования в Котлине.
Это более близкое, но не фактическое решение, которое я искал. У Java есть поддержка, но, похоже, у Kotlin нет.