3

Programming Scala book から、次のコードでconfigFilePath定数が型になることを読みましたUnit:

scala> val configFilePath = if (configFile.exists()) {
| configFile.getAbsolutePath()
| }
configFilePath: Unit = ()

しかし、このコードを REPL で実行すると、 type の結果が得られAnyます。なんで?

本の例では Scala 2.8 を使用しており、私は Scala 2.10 を使用しています。

4

3 に答える 3

7

if (cond) { expr }と同様に、の共通の基本型Unitと の型を返します。exprif (cond) { expr } else { () }

それはAnyValforIntなどでCharあり、UnitforUnitおよびAnyfor AnyRef:

scala> if ( false ) 1
res0: AnyVal = ()

scala> val r = if ( false ) { () }
r: Unit = ()

scala> if ( false ) ""
res1: Any = ()
于 2013-05-08T09:29:29.230 に答える
1

ステートメントは、ifステートメント/クロージャー/変数を取ります。クロージャーを使用する場合、最後のステートメントを使用して型を推測します。なのでconfigFile.getAbsolutePath()は に評価される関数Stringです。 次のいずれかを意味するUnitサブクラス:Any

val configFilePath:Any = if (configFile.exists()) {configFile.getAbsolutePath()}

val configFilePath:Unit = if (configFile.exists()) {configFile.getAbsolutePath()}

編集

たとえば、条件が false と評価されている場合があります。

val map = Map(1 -> "1")
val result = if(map.get(2)=="1") "Whoopie!"

値が存在しないか、値が等しくないため、Any = ()ここでの結果 は型になります。型をelse1String

val configFilePath = if (configFile.exists()) {configFile.getAbsolutePath()} else ""
于 2013-05-08T09:39:04.097 に答える