Je suis nouveau à scala et je trouve le besoin de convertir une valeur booléenne en nombre entier. Je sais que je peux utiliser quelque chose comme if (x) 1 else 0
mais je voudrais savoir s'il existe une méthode préférée, ou quelque chose de construit dans le cadre (c.-à-toInt()
)Existe-t-il un moyen facile de convertir un booléen en un entier?
Répondre
Si vous voulez mélanger Boolean
et Int
opération utilisez un implicit
comme ci-dessus, mais sans créer une 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
Quels sont les avantages de l'utilisation implicite sans classe? –
@Russ Bradberry, Si vous essayez la réponse de @Jackson Davis vous devez appeler explicitement la fonction asInt pour faire la conversion en faisant ==> val a: Int = true n'est pas possible, et ce faisant ==> (1- vrai). La conversion n'est pas transparente. – Patrick
alors est-ce que c'est global? ou dois-je faire quelque chose de spécial pour rendre cela global? aussi, cela fonctionnera-t-il comme quelque chose comme si j'insère dans mysql '" insert dans blah (boolVal) valeurs ("+ b +") "', assumera-t-il automatiquement la version int et non la version bool? –
Vous pouvez le faire facilement avec les 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
La convention de la bibliothèque est d'utiliser 'toInt' - la même chose serait une bonne idée ici. –
assez juste, édité pour refléter cela. –
Cette grande technique est appelée "proxénète ma bibliothèque". –
En fait, je pense que ce soit if (x) 1 else 0
, non if (x) 0 else 1
. C'est pourquoi vous devriez écrire vos propres conversions. Entier n'est pas un booléen, et si vous voulez pour une raison quelconque stocker des booléens comme des entiers, alors vous devriez affiner vos propres normes de la façon dont la vérité et non la vérité sont représentées. Boolean "true" n'est pas un nombre, c'est une instance du type booléen.
Comme java.lang.Boolean.TRUE
. Il peut être stocké en interne sous la forme d'un entier, mais il s'agit d'un détail d'implémentation qui ne doit pas être divulgué dans la langue.
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 modèle plus générale.
bien l'idée était de le convertir en le standard c 0 = faux, 1 = vrai. Mais pourquoi devrais-je utiliser match plutôt que le ternaire sinon? –
Lors de l'utilisation d'un implicit
est probablement la meilleure façon d'aller, si vous voulez une conversion rapide et sale de boolean
à int
vous pouvez utiliser boolean.compare(false)
Depuis Scala 2.10 la solution par Jackson Davis est le plus souvent écrit en utilisant an implicitvalue 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, je l'ai également ajouté un opérateur de multiplication, comme cela est l'utilisation la plus courante d'une conversion booléenne Int pour moi. Je préfère cela à ce que la conversion elle-même soit implicite (solution fournie par Patrick), car elle perd plus de contrôle de type que je ne le souhaite.
Si vous ne voulez pas aller dans le sens 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
Je pensais la même chose en premier, mais le contrat de comparaison ne promet qu'un nombre positif pour true.compare (false). Il se peut donc qu'une implémentation JVM renvoie sth plus grand que 1. –
- 1. ASP.NET - Un moyen facile d'échanger un booléen?
- 2. Un moyen sûr et valide pour convertir un "entier flottant" en un entier naturel?
- 3. C++: moyen sûr de convertir un entier en pointeur
- 4. Convertir un entier en chaîne
- 5. Un moyen facile de convertir un tableau d'objets en un autre type C#
- 6. Convertir un flottant en équivalent entier
- 7. moyen facile de convertir un org.apache.xmlbeansXmlObject à nu.xom.Element
- 8. impossible de convertir un tableau en entier
- 9. Un moyen facile de convertir une collection Doctrine_Collection de Model en un tableau d'objets simples?
- 10. Comment convertir un entier en float en Java?
- 11. Comment convertir un fichier binaire en un entier long?
- 12. convertir un nombre entier dans un tableau
- 13. Le moyen le plus rapide de convertir un entier en un bit au format UInt32?
- 14. Comment convertir un entier en int?
- 15. SQL Server Convertir un entier en chaîne binaire
- 16. C#, moyen rapide d'inverser un booléen nullable?
- 17. Un moyen facile de changer un nom pour un modèle?
- 18. Un moyen facile de convertir # de mois en # d'années et de mois en Groovy
- 19. Comment convertir un entier en un ByteString dans Haskell
- 20. Un moyen facile de convertir une chaîne de 0 et 1 dans un personnage? Plain C
- 21. Convertir un entier 16 bits non signé en un entier 16 bits signé en C#
- 22. Un moyen facile de tester l'application réseau
- 23. Un moyen facile de simuler Viewstate invalide?
- 24. Un moyen facile de charger l'application asp.net
- 25. Comment convertir un CGFloat à un entier non signé
- 26. Convertir un entier en une chaîne signée en Ruby
- 27. Comment convertir un objet String en objet booléen?
- 28. Existe-t-il un moyen facile de trier un CObList?
- 29. Un moyen facile d'obtenir un fichier de test dans JUnit
- 30. Un moyen facile de pdf un rapport Web
Je pense que s'il y avait une méthode dans le cadre, ce serait faire quelque chose plus proche de 'si (x) 1 sinon 0', suivant la tradition C de 0 pour faux et 1 pour vrai. –
Je viens de réaliser mon erreur et édité le post. –
Sans plus de contexte, je dirais que ce n'est pas vraiment une bonne pratique. Les booléens ne sont pas des entiers, je ne convertirai pas implicitement de l'un à l'autre ... Je garderai la conversion explicite, sinon ça pourrait facilement devenir vraiment confus. La devise pour les fonctionnalités avancées de Scala est: "avec une grande puissance vient une grande responsabilité" :) – GClaramunt