Я новичок в scala, и мне нужно преобразовать логическое значение в целое число. Я знаю, что могу использовать что-то вроде if (x) 1 else 0
, но мне хотелось бы знать, есть ли предпочтительный метод или что-то встроенное в фреймворк (т.е. toInt()
)
Есть ли простой способ преобразовать логическое значение в целое?
Ответ 1
Если вы хотите смешивать операции Boolean
и Int
, используйте implicit
, как указано выше, но не создавая класс:
implicit def bool2int(b:Boolean) = if (b) 1 else 0
scala> false:Int
res4: Int = 0
scala> true:Int
res5: Int = 1
scala> val b=true
b: Boolean = true
scala> 2*b+1
res2: Int = 3
Ответ 2
Вы можете сделать это легко с неявными преобразованиями:
class asInt(b: Boolean) {
def toInt = if(b) 1 else 0
}
implicit def convertBooleanToInt(b: Boolean) = new asInt(b)
Затем вы получите что-то вроде
scala> false toInt
res1: Int = 0
Ответ 3
При использовании implicit
, вероятно, лучший способ пойти, если вы хотите быстрое и грязное преобразование от boolean
до int
, вы можете использовать boolean.compare(false)
Ответ 4
Собственно, я ожидаю, что это будет if (x) 1 else 0
, а не if (x) 0 else 1
.
Вот почему вы должны написать свои собственные конверсии. Целое не является логическим, и если вы хотите по какой-то причине сохранить логические значения как целые числа, тогда вы должны отточить свои собственные стандарты того, как представлены истина, а не истина.
Логическое значение "true" не является числом, оно является экземпляром булевого типа. Как java.lang.Boolean.TRUE
. Он может храниться внутри как целое число, но это деталь реализации, которая не должна быть пропущена на язык.
Я бы сказал, что if (x) 0 else 1
является предпочтительным методом преобразования. Это просто и быстро.
Вы также можете написать x match {case true => 0; case false => 1}
, если вы хотите использовать более общий подход к сопоставлению шаблонов.
Ответ 5
Так как Scala 2.10 решение Джексона Дэвиса чаще всего написано с использованием неявного value:
implicit class BoolToInt(val b:Boolean) extends AnyVal {
def toInt = if (b) 1 else 0
def * (x:Int) = if (b) x else 0
}
Для дополнительного удобства я также добавил оператор умножения, так как это наиболее распространенное использование преобразования Boolean to Int для меня. Я предпочитаю это за счет того, что преобразование неявно (решение, предоставленное Патриком), поскольку это теряет больше контроля типа, чем я хочу.
Ответ 6
Если вы не хотите идти неявным способом, это может быть полезно:
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0