我刚接触 Scala,需要将布尔值转换为整数。我知道可以使用类似 if (x) 1 else 0
这样的方法,但我想知道是否有更好的方法或语言内置的方法(例如toInt()
)。
如果您想混合使用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
"insert into blah (boolVal) values (" + b + ")"
,它会自动假定它是int版本而不是bool版本吗? - Russ Bradberry"insert into blah (boolVal) values (" + (b:Int) + ")"
。 - Patrickimport scala.language.implicitConversions
- http://docs.scala-lang.org/tutorials/tour/implicit-conversions.html。 - prayagupa你可以使用隐式转换轻松完成此操作:
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
在使用 implicit
的情况下可能是最好的选择,但如果你想要从 boolean
快速粗略地转换为 int
,可以使用 boolean.compare(false)
实际上,我希望它是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}
。
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
在 Paul 和 Gaurav 的回答基础上,最接近内置的可能是 b.compare(false).sign
。这保证了你得到的是 0 或 1,并且可以说传达了 Iverson 括号的意图。
总的来说,我同意一些评论认为,与其使用分支结构,不如使用直线方法调用更好。这就是为什么 API 提供了像 getOrElse
这样的方法。
implicit def ib (b:Boolean) = if (b) 1 else 0
,尽管我更喜欢muxes:def mux[T](cond: Boolean, yes: => T, no: => T) = if (cond) yes else no
(Scala通过延迟的=>
参数慷慨地启用了它们),从而使得mux(cond, 1,-1)
代替笨重的if (cond) 1 else -1
。 - Val