有没有简单的方法将布尔值转换为整数?

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】:

如果您想混合使用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

【讨论】:

在没有类的情况下使用隐式有什么好处? @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 可能是最好的方法,但如果您想要从booleanint 的快速转换,您可以使用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 的回答有何不同?

以上是关于有没有简单的方法将布尔值转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:将布尔值转换为字符串值

Java:将原始布尔值转换为原始 int (0,1) 的好方法

Knex.js 和 MySQL:将整数转换为布尔值以进行批量选择

将 32 个布尔值的集合转换为 32 位整数 [重复]

将 DataFrame 中的新派生列从布尔值转换为整数

将 int 转换为布尔值的更好方法