web-dev-qa-db-ja.com

ブールを整数に変換する簡単な方法はありますか?

私はscalaに不慣れで、ブール値を整数に変換する必要性を見つけています。if (x) 1 else 0のようなものを使用できることはわかっていますが、推奨されるメソッド、またはフレームワークに組み込まれたもの(つまり、toInt())があります。

41
Russ Bradberry

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
55
Patrick

これは暗黙的な変換で簡単に実行できます。

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
17
Jackson Davis

implicitを使用するのがおそらく最善の方法ですが、booleanからintへの迅速で汚い変換が必要な場合は、boolean.compare(false)を使用できます。

11
Paul Murray

実際には、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}_と記述することもできます。

7
ArtemGr

暗黙の方法を実行したくない場合は、これが役立つことがあります。

var myBool:Boolean = true
myBool: Boolean = true

myBool.compare(false)
res3: Int = 1

myBool = false
myBool: Boolean = false

myBool.compare(false)
res3: Int = 0
5
Gaurav Kumar

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が提供するソリューション)よりも、私はこれを好みます。これは、必要以上に型コントロールが失われるためです。

3
Suma