Pat*_*ick 52
如果你想混合Boolean和Int操作使用implicit如上所述,但没有创建一个类:
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
Run Code Online (Sandbox Code Playgroud)
Jac*_*vis 16
您可以使用隐式转换轻松完成此操作:
class asInt(b: Boolean) {
def toInt = if(b) 1 else 0
}
implicit def convertBooleanToInt(b: Boolean) = new asInt(b)
Run Code Online (Sandbox Code Playgroud)
然后,你会得到类似的东西
scala> false toInt
res1: Int = 0
Run Code Online (Sandbox Code Playgroud)
实际上,我希望它是if (x) 1 else 0,而不是if (x) 0 else 1.
这就是你应该编写自己的转换的原因.整数不是布尔值,如果你想出于某种原因将布尔值存储为整数,那么你应该磨练自己的真理而不是真理的标准.
Boolean"true"不是数字,它是布尔类型的实例.喜欢java.lang.Boolean.TRUE.它可以在内部存储为整数,但这是一个不应泄漏到语言中的实现细节.
我想说这if (x) 0 else 1是首选的转换方法.它简单而快速.
x match {case true => 0; case false => 1}如果要使用更通用的模式匹配方法,也可以编写.
从 Scala 2.10 开始,Jackson Davis 的解决方案更常使用隐式 值类编写:
implicit class BoolToInt(val b:Boolean) extends AnyVal {
def toInt = if (b) 1 else 0
def * (x:Int) = if (b) x else 0
}
Run Code Online (Sandbox Code Playgroud)
为了增加舒适度,我还添加了一个乘法运算符,因为这是我最常用的 Boolean 到 Int 转换。我更喜欢这个而不是使转换本身隐式(由帕特里克提供的解决方案),因为这失去了比我想要的更多的类型控制。
如果您不想采用隐式方式,这可能会很有用:
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
Run Code Online (Sandbox Code Playgroud)