Я плохо знаком с scala, и я нахожу потребность преобразовать булево значение в целое число. Я знаю, что могу использовать что-то как if (x) 1 else 0
но я хотел бы знать, существует ли предпочтительный метод или что-то встроенное в платформу (т.е. toInt()
)
Если вы хотите смешивать логическое
и Int
операцию, используйте неявное
, как указано выше но без создания класса:
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
Вы можете легко сделать это с помощью неявных преобразований:
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
На самом деле, я бы ожидал, что это будет if (x) 1 else 0
, а не if (x) 0 еще 1
.
Вот почему вы должны писать свои собственные преобразования. Целое число не является логическим, и если вы по какой-то причине хотите хранить логические значения как целые числа, вам следует отточить свои собственные стандарты представления истины, а не истины.
Логическое «истина» не является числом, это экземпляр логического типа. Например, java.lang.Boolean.TRUE
. Он может храниться внутри как целое число, но это деталь реализации, которая не должна попадать в язык.
Я бы сказал, что if (x) 0 else 1
является предпочтительным методом преобразования. Это просто и быстро.
Вы также можете написать x match {case true => 0; case false => 1}
, если вы хотите использовать более общий подход к сопоставлению с образцом.