2017-08-22 8 views
-1

私はスカラーに足を浸しているだけで、なぜこのメソッドがコンパイルされないのかに固執しています。ヘッダーにディレクトリパスとテキストファイル名が与えられたファイルを探し、テキストファイルの最初のn行を返すようにします。私が得るコンパイルエラーは:スカラリターンタイプ関数の不一致

タイプの不一致です。

が見つかりました:単位

が必要:あなたが期待するよう文字列

import java.io._ 
def header(fileName:String, directory:String =".",n:Int=5): String = { 
    val files = new File(directory).listFiles 
    for (file <- files if file.getName == fileName) { 

    val source = scala.io.Source.fromFile(file) 

    try{ 
     val string=source.getLines.toList.slice(0,n).mkString 
     string 
    } 
    catch { 
     case e: Exception => "not good. something went wrong" 
    } 
    finally{ 
     source.close 
    } 
    } 
} 

答えて

0

あなたのforループは、応答を返すされていません。どちらか一方で可変変数を使用して変数を返すことができます。

{ 
     ... 

     var response = "" 
     for (file <- files if file.getName == fileName) { 
      try { 
       response = source.getLines.toList.slice(0,n).mkString 
      } 
      ... 
     } // end of for 
     response 
    } 

それともあなたにArray[String]を与える.map続い.filterを使用する(推奨されません)。

def header(fileName:String, directory:String =".",n:Int=5): String = { 

    val files = new File(directory).listFiles 

    val response= files.filter(_.getName.equals(fileName)).map { file => 
    val source = scala.io.Source.fromFile(file) 
    val sliced = source.getLines.toList.slice(0,n).mkString 
    source.close() 
    sliced 
    } 

    response(0) 
} 
+1

私はスカラを学習する際に、より多くの機能プログラミングパターンを自分のコードに入れようとしているので、2番目のフィルタ/マップメソッドはかなり滑らかです。 –

+0

間違いなく、機能していない言語でのやり方としての最初の答えは使用しないでください。 – prayagupd

+0

しかし、最後に各ソースを閉じるのはどうですか?私は、mapメソッドの関数リテラルにsource.closeを追加しようとしましたが、それは再びタイプエラーを出しました。 –