有没有简单的方法将布尔值转换为整数?
Posted
技术标签:
【中文标题】有没有简单的方法将布尔值转换为整数?【英文标题】:Is There an Easy Way to Convert a Boolean to an Integer? 【发布时间】:2011-02-07 16:32:55 【问题描述】:我是 scala 的新手,我发现需要将布尔值转换为整数。我知道我可以使用if (x) 1 else 0
之类的东西,但我想知道是否有首选方法,或者框架中内置的东西(即toInt()
)
【问题讨论】:
如果没有更多上下文,我会说这不是一个好习惯。布尔值不是整数,我不会隐式地从一个转换到另一个......我会保持转换显式,否则它很容易变得非常混乱。 Scala 高级特性的座右铭是:“能力越大,责任越大”:) 我认为您要求的函数的正确名称称为“艾弗森括号”(google it)。所以,它必须是implicit def ib (b:Boolean) = if (b) 1 else 0
,尽管我更喜欢多路复用器:def mux[T](cond: Boolean, yes: => T, no: => T) = if (cond) yes else no
(Scala 通过延迟=>
参数慷慨地启用它们)启用mux(cond, 1,-1)
而不是笨重的if (cond) 1 else -1
。
【参考方案1】:
您可以通过隐式转换轻松做到这一点:
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
【讨论】:
这项伟大的技术被称为“pimp my library”。【参考方案2】:如果您想混合使用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
【讨论】:
在没有类的情况下使用隐式有什么好处? @Russ Bradberry,如果你尝试@Jackson Davis 的答案,你必须明确调用函数 asInt 来进行转换,所以这样做 ==> val a:Int=true 是不可能的,所以做 ==> (1-true)。转换不透明。 所以这是否使它成为全球性的?还是我需要做一些特别的事情来使这个全球化?另外,如果我插入到 mysql"insert into blah (boolVal) values (" + b + ")"
中,这是否会起作用,它会自动假定它的 int 版本而不是 bool 版本吗?
@Russ Bradberry 它不是全局的,您可以将您的隐式放入一个对象中,然后在需要进行一些转换时导入它们
也添加import scala.language.implicitConversions
- docs.scala-lang.org/tutorials/tour/implicit-conversions.html【参考方案3】:
实际上,我希望它是if (x) 1 else 0
,而不是if (x) 0 else 1
。
这就是为什么您应该编写自己的转换。整数不是布尔值,如果您出于某种原因想要将布尔值存储为整数,那么您应该磨练自己的标准来表示真值而不是真值。
Boolean "true" 不是数字,它是 Boolean 类型的一个实例。喜欢java.lang.Boolean.TRUE
。它可以在内部存储为整数,但这是一个不应该泄露到语言中的实现细节。
我会说if (x) 0 else 1
是首选的转换方法。它简单快捷。
如果你想使用更通用的模式匹配方法,你也可以写x match case true => 0; case false => 1
。
【讨论】:
这个想法是将其转换为 c 标准 0=false, 1=true。但是为什么我要使用 match 而不是三元 if else 呢?【参考方案4】:虽然使用implicit
可能是最好的方法,但如果您想要从boolean
到int
的快速转换,您可以使用boolean.compare(false)
【讨论】:
警告:正如@KristjanVeskimäe 评论的那样,比较不保证 1,只有一个正数 - 参见。 docs.oracle.com/javase/7/docs/api/java/lang/…【参考方案5】:自 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 提供的解决方案),因为这样会失去比我想要的更多的类型控制。
【讨论】:
【参考方案6】:如果您不想采用隐式方式,这可能很有用:
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
【讨论】:
我一开始也是这么想的,但是 compare 的合约只承诺 true.compare(false) 的正数。所以可能是 JVM 实现返回大于 1 的东西。 这与 Paul Murray 的回答有何不同?以上是关于有没有简单的方法将布尔值转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章
Java:将原始布尔值转换为原始 int (0,1) 的好方法