web-dev-qa-db-fra.com

Existe-t-il un moyen simple de convertir un booléen en entier?

Je suis nouveau à scala et je trouve la nécessité de convertir une valeur booléenne en un entier. Je sais que je peux utiliser quelque chose comme if (x) 1 else 0 mais je voudrais savoir si il y a une méthode préférée, ou quelque chose de construit dans le framework (ie toInt())

41
Russ Bradberry

Si vous souhaitez mélanger les opérations Boolean et Int, utilisez un implicit comme ci-dessus mais sans créer de classe:

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
55
Patrick

Vous pouvez le faire facilement avec des conversions implicites:

class asInt(b: Boolean) {
  def toInt = if(b) 1 else 0
}

implicit def convertBooleanToInt(b: Boolean) = new asInt(b)

Ensuite, vous obtiendrez quelque chose comme

scala> false toInt
res1: Int = 0
17
Jackson Davis

Bien que l'utilisation d'un implicit soit probablement la meilleure façon de procéder, si vous voulez une conversion rapide et sale de boolean à int, vous pouvez utiliser boolean.compare(false)

11
Paul Murray

En fait, je m'attendrais à ce que ce soit if (x) 1 else 0, pas if (x) 0 else 1.

C'est pourquoi vous devez écrire vos propres conversions. L'entier n'est pas un booléen, et si vous voulez pour une raison quelconque stocker les booléens sous forme d'entiers, vous devez affiner vos propres normes sur la façon dont la vérité et non la vérité sont représentées.

Le booléen "true" n'est pas un nombre, c'est une instance de type booléen. Comme Java.lang.Boolean.TRUE. Il peut être stocké en interne sous forme d'entier, mais c'est un détail d'implémentation qui ne doit pas être divulgué dans le langage.

Je dirais que if (x) 0 else 1 est la méthode de conversion préférée. C'est simple et rapide.

Vous pouvez également écrire x match {case true => 0; case false => 1} Si vous souhaitez utiliser une approche de correspondance de motifs plus générale.

7
ArtemGr

Si vous ne voulez pas suivre la voie implicite, cela peut être utile:

var myBool:Boolean = true
myBool: Boolean = true

myBool.compare(false)
res3: Int = 1

myBool = false
myBool: Boolean = false

myBool.compare(false)
res3: Int = 0
5
Gaurav Kumar

Puisque Scala 2.10 la solution de Jackson Davis est plus souvent écrite en utilisant n implicitevaleur classe:

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

Pour plus de confort, j'ai également ajouté un opérateur de multiplication, car c'est pour moi l'utilisation la plus courante d'une conversion booléenne en Int. Je préfère cela plutôt que la conversion elle-même implicite (solution fournie par Patrick), car cela perd plus de contrôle de type que je ne le souhaite.

3
Suma