Sono nuovo di scala e sto riscontrando la necessità di convertire un valore booleano in un numero intero. So che posso usare qualcosa come if (x) 1 else 0
ma mi piacerebbe sapere se esiste un metodo preferito, o qualcosa di integrato nel framework (cioè toInt()
)C'è un modo semplice per convertire un booleano in un intero?
risposta
Se volete mescolare Boolean
e Int
funzionamento utilizza un implicit
come sopra, ma senza creare una 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
quali sono i vantaggi dell'utilizzo implicito senza una classe? –
@Russ Bradberry, Se provi la risposta da @Jackson Davis devi chiamare esplicitamente la funzione asInt per fare la conversione così facendo ==> val a: Int = true non è possibile, e così facendo ==> (1- vero). La conversione non è trasparente. – Patrick
quindi questo lo rende globale? o devo fare qualcosa di speciale per rendere questo globale? inoltre, funzionerà come se inserissi in mysql "" insert in blah (boolVal) values ("+ b +") "', assumerà automaticamente la sua versione int e non la versione bool? –
Lo si può fare facilmente con conversioni implicite:
class asInt(b: Boolean) {
def toInt = if(b) 1 else 0
}
implicit def convertBooleanToInt(b: Boolean) = new asInt(b)
Poi, si otterrà qualcosa di simile
scala> false toInt
res1: Int = 0
La convenzione di libreria è quella di usare 'toInt' - la stessa cosa sarebbe una buona idea qui. –
abbastanza giusto, modificato per riflettere questo. –
Questa grande tecnica si chiama "pimp my library". –
In realtà, mi aspetto che sia if (x) 1 else 0
, non if (x) 0 else 1
.
Ecco perché è necessario scrivere le proprie conversioni. L'intero non è un valore booleano, e se vuoi per qualche ragione archiviare i booleani come numeri interi, allora dovresti affinare i tuoi standard su come vengono rappresentate la verità e non la verità.
booleano "vero" non è un numero, è un esempio del tipo booleano. Come java.lang.Boolean.TRUE
. Può essere memorizzato internamente come numero intero, ma questo è un dettaglio di implementazione che non dovrebbe essere trapelato nella lingua.
direi che if (x) 0 else 1
è il metodo preferito di conversione. È semplice e veloce
È possibile anche scrivere x match {case true => 0; case false => 1}
se si desidera utilizzare un modello più generale di corrispondenza approccio.
beh l'idea era di convertirla in lo standard c 0 = falso, 1 = vero. Ma perché dovrei usare la partita piuttosto che il ternario se altro? –
Quando si utilizza un implicit
è probabilmente il modo migliore per andare, se si vuole una conversione rapida e-sporco da boolean
a int
è possibile utilizzare boolean.compare(false)
Dal Scala 2.10 la soluzione da Jackson Davis è più spesso scritto utilizzando 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
}
per una maggiore comodità ho anche aggiunto un operatore di moltiplicazione, in quanto questo è l'uso più comune di un valore booleano a Int conversione per me. Preferisco questo rendendo la conversione stessa implicita (soluzione fornita da Patrick), in quanto ciò perde più del controllo di tipo di quello che voglio.
Se non si vuole andare il modo implicito, questo può essere 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
Ho pensato la stessa cosa prima, ma il contratto di confronto promette solo un numero positivo per true.compare (false). Quindi potrebbe essere che un'implementazione JVM ritorni sth più grande di 1. –
- 1. Il modo più semplice per convertire in booleano
- 2. Convertire booleano per intero in VB.NET
- 3. Il modo più semplice per capovolgere un valore booleano?
- 4. convertire un intero in base36
- 5. modo semplice per convertire una stringa in un dizionario
- 6. Esiste un modo semplice per convertire i criteri in HQL?
- 7. Come convertire un intero in un array in PHP?
- 8. Come convertire un intero in una stringa in modo flessibile?
- 9. Converti booleano per intero in elisir
- 10. Esiste un modo semplice per convertire un timestamp ISO8601 in un NSDate formattato?
- 11. Un modo semplice per convertire il codice c nell'assemblaggio x86?
- 12. Is 'integer + ""' un buon modo per convertire un intero in stringa in Java?
- 13. Come convertire un numero intero in serie
- 14. C'è un modo semplice per determinare se l'input dell'utente è un numero intero in bash?
- 15. C'è un modo per evitare di passare inavvertitamente un argomento non booleano ad un parametro booleano?
- 16. Perché si desidera convertire un oggetto in booleano quando viene utilizzato in un contesto booleano?
- 17. Un modo semplice per disabilitare un UITextField?
- 18. intero ruby in booleano
- 19. Il modo più semplice per convertire un elenco in un set in Java
- 20. Il modo più semplice per convertire un URL in un collegamento ipertestuale in una stringa C#?
- 21. Esiste un modo in Java per convertire un intero nel suo ordinale?
- 22. Il modo migliore per convertire un intero con segno in un unsigned long?
- 23. Convertire un numero intero in un array di caratteri: java
- 24. Convertire un intero sito wordpress in HTTPS
- 25. Come convertire un intero rubino in un simbolo
- 26. Come convertire un valore intero in stringa?
- 27. Postscript: come convertire un intero in stringa?
- 28. Convertire un numero intero in un numero float in Golang
- 29. Un modo semplice per convertire un dizionario <stringa, stringa> in xml e viceversa
- 30. C'è un modo semplice per convertire il file .xls in un file .csv? (Excel)
Penso che se ci fosse un metodo nel quadro, sarebbe fare qualcosa di più simile a 'se (x) 1 altro 0', seguendo la tradizione C di 0 per falso e 1 per vero. –
ho appena realizzato il mio errore e modificato il post. –
Senza più contesto, direi che non è davvero una buona pratica. I booleani non sono interi, non convertirò implicitamente da uno all'altro ... Manterò la conversione esplicita, altrimenti potrebbe facilmente diventare davvero confuso. Il motto per le funzionalità avanzate di Scala è: "con un grande potere derivano grandi responsabilità" :) – GClaramunt