6

在 Scala 中确定对象是真还是假的规则是什么?我找到了许多其他语言,如 Ruby、JavaScript 等,但似乎找不到 Scala 的权威列表。

4

3 回答 3

19

Scala 中没有数据类型强制转换为Boolean.

所以……true是真的,false也是假的。没有其他值可以用作布尔值。

没有比这更简单的了。

于 2012-10-15T21:18:35.427 回答
4

我不知道为什么以前没有人回答这个问题。@Aaron 是对的,但他的回答超出了 OP 范围。

您可以使用以下隐式转换将所有值强制为布尔值:

implicit def toBoolean(e: Int) = e != 0
implicit def toBoolean(e: String) = e != null && e != "false" && e != ""
  ...

但你甚至可以拥有更好的东西。要使类型的行为类似于您自己的类型的 javascript:

trait BooleanLike[T] {
  def isTrue(e: T): Boolean
}
implicit object IntBooleanLike extends BooleanLike[Int] {
  def isTrue(e: Int) = e != 0
}
implicit object StringBooleanLike extends BooleanLike[String] {
  def isTrue(e: String) = e != null && e != ""
}

implicit class RichBooleanLike[T : BooleanLike](e: T) {
  def ||[U >: T](other: =>U): U = if(implicitly[BooleanLike[T]].isTrue(e)) e else other
  def &&(other: =>T): T = if(implicitly[BooleanLike[T]].isTrue(e)) other else e
}

现在你可以在 REPL 中尝试它,它真的变得像 Javascript。

> 5 || 2
res0: Int = 5
> 0 || 2
res1: Int = 2
> 2 && 6
res1: Int = 6
> "" || "other string"
res2: String = "other string"
> val a: String = null; a || "other string"
a: String = null
res3: String = other string

这就是我喜欢 Scala 的原因。

于 2014-11-11T23:01:24.840 回答
0

您没有找到它,因为 Scala 中不存在等效的概念,尽管您可以为自己定义类似的东西(Scalaz等库就是这样做的)。例如,

class Zero[T](v: T)

object Zero {
  implicit object EmptyString extends Zero("")
  implicit object NotANumber extends Zero(Double.NaN)
  implicit def none[T]: Zero[Option[T]] = new Zero(None)
}
于 2012-10-15T21:28:29.147 回答