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()
)
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
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
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)
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.
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
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.