Есть ли простой способ конвертировать логическое значение в целое число? - PullRequest
38 голосов
/ 14 апреля 2010

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

Ответы [ 6 ]

50 голосов
/ 14 апреля 2010

Если вы хотите смешать операции 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
16 голосов
/ 14 апреля 2010

Вы можете сделать это легко с неявными преобразованиями:

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
11 голосов
/ 27 сентября 2013

Хотя использование implicit, вероятно, является лучшим способом, если вы хотите быстрое и грязное преобразование из boolean в int, вы можете использовать boolean.compare(false)

6 голосов
/ 14 апреля 2010

На самом деле, я бы ожидал, что это будет if (x) 1 else 0, а не if (x) 0 else 1.

Вот почему вы должны писать свои собственные преобразования. Целое число не является логическим значением, и если по какой-то причине вы хотите хранить логические значения в виде целых чисел, вам следует отточить свои собственные стандарты представления истины, а не истины.

Логическое «истина» - это не число, это экземпляр логического типа. Как java.lang.Boolean.TRUE. Он может храниться внутри как целое число, но это деталь реализации, которая не должна попадать в язык.

Я бы сказал, что if (x) 0 else 1 является предпочтительным методом конвертации. Это просто и быстро.

Вы также можете написать x match {case true => 0; case false => 1}, если хотите использовать более общий подход сопоставления с образцом.

5 голосов
/ 30 августа 2016

Если вы не хотите идти неявным путем, это может быть полезно:

var myBool:Boolean = true
myBool: Boolean = true

myBool.compare(false)
res3: Int = 1

myBool = false
myBool: Boolean = false

myBool.compare(false)
res3: Int = 0
3 голосов
/ 25 сентября 2014

Начиная с Scala 2.10 решение Джексона Дэвиса чаще пишется с использованием неявного значения класса:

implicit class BoolToInt(val b:Boolean) extends AnyVal {
  def toInt = if (b) 1 else 0
  def * (x:Int) = if (b) x else 0
}

Для дополнительного комфорта я также добавил оператор умножения, поскольку для меня это наиболее распространенное использование преобразования логического типа в Int. Я предпочитаю это, а не делать само преобразование неявным (решение, предоставленное Патриком), поскольку оно теряет больше контроля над типами, чем я хочу.

...