在Scala中确定对象是否真实/虚假的规则是什么?我发现很多其他语言,如Ruby,JavaScript等,但似乎无法找到Scala的权威列表。
答案 0 :(得分:17)
Scala中没有数据类型强制转换为Boolean
。
所以... true
是真实的,false
是假的。没有其他值可以用作布尔值。
它不能比那简单。
答案 1 :(得分:3)
我不知道为什么之前没有人回答这个问题。 @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
这就是我爱斯卡拉的原因。
答案 2 :(得分: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)
}