我是scala的新手,我发现需要将布尔值转换为整数。我知道我可以使用像if (x) 1 else 0
这样的东西,但我想知道是否有一个首选的方法,或者框架内置的东西(即toInt()
)
答案 0 :(得分:50)
如果您想混合使用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
答案 1 :(得分:15)
您可以使用隐式转换轻松完成此操作:
class asInt(b: Boolean) {
def toInt = if(b) 1 else 0
}
implicit def convertBooleanToInt(b: Boolean) = new asInt(b)
然后,你会得到像
这样的东西scala> false toInt
res1: Int = 0
答案 2 :(得分:11)
使用implicit
可能是最好的方法,如果您想要从boolean
到int
进行快速转换,可以使用boolean.compare(false)
< / p>
答案 3 :(得分:6)
实际上,我希望它是if (x) 1 else 0
,而不是if (x) 0 else 1
。
这就是你应该编写自己的转换的原因。整数不是布尔值,如果你想出于某种原因将布尔值存储为整数,那么你应该磨练自己的真理而不是真理的标准。
布尔值“true”不是数字,它是布尔类型的实例。像java.lang.Boolean.TRUE
一样。它可以在内部存储为整数,但这是一个不应泄露到语言中的实现细节。
我会说if (x) 0 else 1
是首选的转换方法。它简单而快速。
如果您想使用更通用的模式匹配方法,也可以编写x match {case true => 0; case false => 1}
。
答案 4 :(得分:4)
如果您不想采用隐式方式,这可能很有用:
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
答案 5 :(得分:3)
自Scala 2.10以来,Jackson Davis的解决方案通常使用an implicit value类编写:
implicit class BoolToInt(val b:Boolean) extends AnyVal {
def toInt = if (b) 1 else 0
def * (x:Int) = if (b) x else 0
}
为了增加舒适度,我还添加了一个乘法运算符,因为这是我对布尔到Int转换的最常见用法。我更倾向于使转换本身隐含(由Patrick提供的解决方案),因为它失去了比我想要的更多的类型控制。