私はscalaに不慣れで、ブール値を整数に変換する必要性を見つけています。if (x) 1 else 0
のようなものを使用できることはわかっていますが、推奨されるメソッド、またはフレームワークに組み込まれたもの(つまり、toInt()
)があります。
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
これは暗黙的な変換で簡単に実行できます。
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
implicit
を使用するのがおそらく最善の方法ですが、boolean
からint
への迅速で汚い変換が必要な場合は、boolean.compare(false)
を使用できます。
実際には、if (x) 1 else 0
ではなくif (x) 0 else 1
になると思います。
そのため、独自の変換を作成する必要があります。整数はブール値ではないため、何らかの理由でブール値を整数として格納したい場合は、真実ではなく真実がどのように表されるかについて、独自の基準を磨く必要があります。
ブール値の「true」は数値ではなく、ブール型のインスタンスです。 _Java.lang.Boolean.TRUE
_のように。内部的に整数として保存できますが、これは言語に漏出してはならない実装の詳細です。
if (x) 0 else 1
が推奨される変換方法だと思います。シンプルで高速です。
より一般的なパターンマッチングアプローチを使用する場合は、_x match {case true => 0; case false => 1}
_と記述することもできます。
暗黙の方法を実行したくない場合は、これが役立つことがあります。
var myBool:Boolean = true
myBool: Boolean = true
myBool.compare(false)
res3: Int = 1
myBool = false
myBool: Boolean = false
myBool.compare(false)
res3: Int = 0
Scala 2.10なので、Jackson Davisによる解決策は an implicitvalue classを使用してより頻繁に記述されます:
implicit class BoolToInt(val b:Boolean) extends AnyVal {
def toInt = if (b) 1 else 0
def * (x:Int) = if (b) x else 0
}
さらに快適にするために、ブール演算子から整数への変換の最も一般的な使用法である乗算演算子も追加しました。変換自体を暗黙的にする(Patrickが提供するソリューション)よりも、私はこれを好みます。これは、必要以上に型コントロールが失われるためです。