2016-09-03 4 views
0

ファイルのパスをconfigureから読み込んで、idalaのScalaの方法でファイルを読み込みたいとします。これは私がこれまで持っているコードです:イムはエラーを取得して以来、プロパティからファイルパスを読み取って慣用的なファイルを読み込みます。Scala

val key: Option[String] = { 
    val publicKeyPath: Option[String] = conf.getString("bestnet.publicKeyFile") 
    publicKeyPath match { 
    case Some(path) => { 
     Future { 
     val source = fromFile(s"./$path") 
     val key: String = source.getLines.toIterable.drop(1).dropRight(1).mkString 
     source.close() 
     key 
     } onComplete { 
     case Success(key) => Success(key) 
     case Failure(t) => None 
     } 
    } 
    case None => None 
    } 
} 

は、しかし、これは動作していないExpression of type Unit does not conform to Option[String]

私が間違って取得し、Scalaの私のアプローチ慣用的であるか、他のいくつかの中で行われる必要がありますしていますどのような方法?

+0

'getString'は' Option [T] 'を返しますか? –

+0

more types with more types – user3139545

+0

未来の "onComplete"はユニットを返します。おそらくあなたがしたいことは、未来を「地図」することです。 – Jegan

答えて

0

Stringとして内容を返信する場合は、Futureを使用する必要はありません。例えば。以下はだろう:

val key: Option[String] = { 
    val publicKeyPath: Option[String] = conf.getString("bestnet.publicKeyFile") 
    publicKeyPath match { 
    case Some(path) => 
     val source = fromFile(s"./$path") 
     val key: String = source.getLines.toIterable.drop(1).dropRight(1).mkString 
     source.close() 
     Some(key) 
    case None => 
     None 
    } 
} 
Some(_)の値を変換するパターンは、より高いレベルの機能 map、すなわち使用して、より慣用的に行うことができる

val key: Option[String] = { 
    val publicKeyPath = conf.getString("bestnet.publicKeyFile") 

    publicKeyPath.map(path => { 
     val source = fromFile(s"./$path") 
     val key = source.getLines.toIterable.drop(1).dropRight(1).mkString 
     source.close() 
     key 
    }) 
} 

リソースを行うために、より慣用的な方法を管理(すなわち、Sourceを閉じる)は、「ローンパターン」を使用することです。例えば:

def using[A](r: Resource)(f: Resource => A): A = try { 
    f(r) 
} finally { 
    r.dispose() 
} 

val key: Option[String] = { 
    val publicKeyPath = conf.getString("bestnet.publicKeyFile") 

    publicKeyPath.map(path => 
     using(fromFile(s"./$path"))(source => 
      source.getLines.toIterable.drop(1).dropRight(1).mkString 
    ) 
) 
} 

Scalaは柔軟な言語であり、(Javaで、using抽象言語機能であるのに対して)ユーザランドにそのような抽象化を定義することは珍しいことではありません。

非ブロッキングの並列コードが必要な場合は、Option[String]の代わりにFuture[String]を返す必要があります。これは、異なる時間にコードが実行されるため、自動リソース管理が複雑になります。とにかく、これはあなたのコードを改善するためのいくつかの指針を与える必要があります。

関連する問題