有一种简单的方法可以将布尔值转换为整数吗?

Rus*_*rry 40 integer casting boolean scala

我是scala的新手,我发现需要将布尔值转换为整数.我知道我可以使用类似的东西,if (x) 1 else 0但我想知道是否有一个首选的方法,或框架中内置的东西(即toInt())

Pat*_*ick 52

如果你想混合BooleanInt操作使用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)

  • 库惯例是使用`toInt` - 这同样是一个好主意. (4认同)
  • 这项伟大的技术被称为"皮条客我的图书馆". (4认同)

Pau*_*ray 11

虽然使用a implicit可能是最好的方法,但如果你想要快速和肮脏的转换boolean,int你可以使用boolean.compare(false)


Art*_*mGr 6

实际上,我希望它是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}如果要使用更通用的模式匹配方法,也可以编写.


Sum*_*uma 5

从 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 转换。我更喜欢这个而不是使转换本身隐式(由帕特里克提供的解决方案),因为这失去了比我想要的更多的类型控制。


Gau*_*mar 5

如果您不想采用隐式方式,这可能会很有用:

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)

  • 我首先也想过,但是compare的约定只对true.compare(false)承诺一个正数。因此,JVM实现可能返回的值大于1。 (3认同)