Soy nuevo en scala y encuentro la necesidad de convertir un valor booleano en un entero. Sé que puedo usar algo como if (x) 1 else 0
pero me gustaría saber si hay un método preferido, o algo integrado en el marco (es decir toInt()
)¿Existe una manera fácil de convertir un valor booleano a un número entero?
Respuesta
Si usted quiere mezclar Boolean
y Int
operación utiliza un implicit
que el anterior pero sin crear una clase:
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
¿Cuáles son las ventajas de usar implícito sin una clase? –
@Russ Bradberry, si intenta la respuesta de @Jackson Davis, tiene que llamar explícitamente la función como No para hacer la conversión, por lo que hacer ==> val a: Int = verdadero no es posible, y así lo hace ==> (1- cierto). La conversión no es transparente. – Patrick
, ¿esto lo hace global? ¿o necesito hacer algo especial para que esto sea global? también, ¿funcionará esto como algo así como si inserto en mysql '" insert into blah (boolVal) values ("+ b +") "', asumirá automáticamente su versión int y no la versión bool? –
Esto se puede hacer fácilmente con las conversiones implícitas:
class asInt(b: Boolean) {
def toInt = if(b) 1 else 0
}
implicit def convertBooleanToInt(b: Boolean) = new asInt(b)
a continuación, obtendrá algo así como
scala> false toInt
res1: Int = 0
La convención de la biblioteca es usar 'toInt'; la misma sería una buena idea aquí. –
lo suficientemente justo, editado para reflejar eso. –
Esta gran técnica se llama "proxeneta mi biblioteca". –
En realidad, me esperaba que fuera if (x) 1 else 0
, no if (x) 0 else 1
.
Es por eso que debe escribir sus propias conversiones. Integer no es un booleano, y si desea por alguna razón almacenar booleanos como enteros, entonces debe perfeccionar sus propios estándares de cómo se representa la verdad y no la verdad.
Booleano "verdadero" no es un número, es una instancia del tipo booleano. Me gusta java.lang.Boolean.TRUE
. Se puede almacenar internamente como un entero, pero es un detalle de implementación que no debe filtrarse en el lenguaje.
Yo diría que if (x) 0 else 1
es el método preferido de conversión. Es simple y rápido.
También puede escribir x match {case true => 0; case false => 1}
si desea utilizar un enfoque de coincidencia de patrones más general.
y la idea era convertirlo a el estándar c 0 = falso, 1 = verdadero. ¿Pero por qué usaría el fósforo en vez del ternario si no es así? –
Mientras que el uso de un implicit
es probablemente el mejor camino a seguir, si desea una conversión rápida y sucio de boolean
a int
puede utilizar boolean.compare(false)
Desde Scala 2.10 la solución por Jackson Davis es más a menudo escrito utilizando an implicitvalue clase:
implicit class BoolToInt(val b:Boolean) extends AnyVal {
def toInt = if (b) 1 else 0
def * (x:Int) = if (b) x else 0
}
para mayor comodidad también he añadido un operador de multiplicación, ya que esto es el uso más común de una conversión de Boole a Int para mí. Prefiero esto más que hacer que la conversión sea implícita (solución provista por Patrick), ya que eso pierde más control de tipo de lo que yo quiero.
Si no desea seguir el camino implícita, esto puede ser útil:
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
Pensé lo mismo primero, pero el contrato de comparación solo promete un número positivo para true.compare (falso). Entonces, puede ser que una implementación de JVM devuelva algo más grande que 1. –
- 1. Al convertir un booleano en un entero, devuelve -1 verdadero?
- 2. convertir un valor de cable a un entero en verilog
- 3. convertir un número entero en una matriz
- 4. se establece un valor booleano en base a un número entero
- 5. ruby entero a booleano
- 6. C++ convertir clase a booleano
- 7. En JavaScript/jQuery, ¿cuál es la mejor manera de convertir un número con una coma en un número entero?
- 8. ¿Por qué la concatenación de un valor booleano devuelve un número entero?
- 9. Cómo convertir un valor entero a una cadena?
- 10. ¿La mejor manera de convertir un número entero en un nombre de mes en C#?
- 11. convertir un número entero en una cadena como 3
- 12. ¿La forma más fácil de voltear un valor booleano?
- 13. Convertir un número entero en una cadena sin asignar memoria
- 14. Convertir un entero grande a una cadena completa en PHP
- 15. Convertir una cadena a un entero en Android
- 16. Convierte una cadena hexadecimal a un número entero de manera eficiente en C?
- 17. Cómo convertir un entero a serial
- 18. Cómo convertir un número entero en un vector binario?
- 19. ¿Cómo puedo convertir un número entero en float en Java?
- 20. Cómo convertir un número entero de rubí en un símbolo
- 21. número entero no 'se reduce a un número entero'
- 22. ¿Cómo convertir una cadena numérica con comas de valor de posición en un número entero?
- 23. ¿Cómo puedo convertir el valor de esta columna a un número entero?
- 24. Convertir exponencial de un número entero en PHP
- 25. ¿Cómo puedo convertir un número entero en su representación verbal?
- 26. ¿Cómo saber si un objeto es un número entero o una cadena o isa booleano?
- 27. ¿Cuál es la mejor manera de convertir una variable a un booleano en php?
- 28. número entero Divide y obtener valor entero
- 29. jQuery/JavaScript: convertir píxeles a em de una manera fácil
- 30. La mejor manera de obligar a un usuario a ingresar un número entero en Matlab
Creo que si no había un método en el marco, sería hacer algo más parecido a 'si (x) 1 else 0', siguiendo la tradición C de 0 para falso y 1 para verdadero. –
me acabo de dar cuenta de mi error y edité la publicación. –
Sin más contexto, diría que no es realmente una buena práctica. Los booleanos no son enteros, no convertiré implícitamente de uno a otro ... Mantendré la conversión explícita, de lo contrario, puede ser muy confuso. El lema de las características avanzadas de Scala es: "con gran poder viene una gran responsabilidad" :) – GClaramunt