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 に答える