我是Scala新手,我发现需要将布尔值转换为整数。我知道我可以使用类似if (x) 1 else 0的东西,但我想知道是否有首选方法,或内置在语言中的东西(即toInt())。
if (x) 1 else 0
toInt()
tjrkku2a1#
如果你想混合Boolean和Int操作,那么就像上面那样使用implicit,但是不要创建类:
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
pdtvr36n2#
使用隐式转换可以轻松地完成此操作:
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
h7appiyu3#
虽然使用implicit可能是最好的方法,但如果您希望快速地将boolean转换为int,则可以使用boolean.compare(false)
boolean
int
boolean.compare(false)
bkkx9g8r4#
实际上,我希望它是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}。
if (x) 0 else 1
java.lang.Boolean.TRUE
x match {case true => 0; case false => 1}
wswtfjt75#
自Scala 2.10以来,JacksonDavis的解决方案更常使用an implicitvalue类编写:
implicit class BoolToInt(val b:Boolean) extends AnyVal { def toInt: Int = if (b) 1 else 0 def * (x:Int): Int = if (b) x else 0 }
为了增加舒适度,我还添加了一个乘法运算符,因为这是布尔到整数转换最常见的用法。我宁愿这样做,而不是隐式转换(帕特里克提供的解决方案),因为这样会失去更多的类型控制。
az31mfrm6#
如果您不想使用隐式方法,以下命令可能会很有用:
var myBool:Boolean = true myBool: Boolean = true myBool.compare(false) res3: Int = 1 myBool = false myBool: Boolean = false myBool.compare(false) res3: Int = 0
6条答案
按热度按时间tjrkku2a1#
如果你想混合
Boolean
和Int
操作,那么就像上面那样使用implicit
,但是不要创建类:pdtvr36n2#
使用隐式转换可以轻松地完成此操作:
然后,您将获得类似于
h7appiyu3#
虽然使用
implicit
可能是最好的方法,但如果您希望快速地将boolean
转换为int
,则可以使用boolean.compare(false)
bkkx9g8r4#
实际上,我希望它是
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}
。wswtfjt75#
自Scala 2.10以来,JacksonDavis的解决方案更常使用an implicitvalue类编写:
为了增加舒适度,我还添加了一个乘法运算符,因为这是布尔到整数转换最常见的用法。我宁愿这样做,而不是隐式转换(帕特里克提供的解决方案),因为这样会失去更多的类型控制。
az31mfrm6#
如果您不想使用隐式方法,以下命令可能会很有用: