Подтвердить что ты не робот

Есть ли простой способ преобразовать логическое значение в целое?

Я новичок в scala, и мне нужно преобразовать логическое значение в целое число. Я знаю, что могу использовать что-то вроде if (x) 1 else 0, но мне хотелось бы знать, есть ли предпочтительный метод или что-то встроенное в фреймворк (т.е. toInt())

4b9b3361

Ответ 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