3

私はEclipseでScala-IDEを使ってScalaを学んでいます。第9章:制御の抽象化、パート1:Scalaでのプログラミングにおけるコードの重複の削減の本に従って、私は本からコードを書きました(以下に完全に示されています)、それはうまくいきました!不要な空白行を削除し始めたとき、奇妙なことが起こりました。filterFiles()メソッドの空白行を削除する前のコード全体を次に示します。

object Code_c09s01_ControlAbstraction extends App{

  object FilesFilter {

    private def filterFiles(path: String, pattern: String, matcher: (String, String) => Boolean) = {

      val files = (new java.io.File(path)) listFiles

      for(file <- files if matcher(file.getName, pattern)) yield file
    } 

    def filterExtension(path: String, pattern: String) = filterFiles(path, pattern, _.endsWith(_))
    def filterName(path: String, pattern: String) = filterFiles(path, pattern, _.contains(_))
    def filterRegex(path: String, pattern: String) = filterFiles(path, pattern, _.matches(_))
  }

  def printArray[A](message: String, arr: Array[A]) {
    println (message)
    println (arr mkString("\n"))
  }

  def test() {
    val path = "C:\\";

    printArray("--- filtering by ext: ---", FilesFilter.filterExtension(path, ".txt"))
    printArray("--- filtering by containment: ---", FilesFilter.filterName(path, "1"))
    printArray("--- filtering by regex: ---", FilesFilter.filterRegex(path, "."))
  }

  test

}

これは問題なく動作します!ただし、メソッドから空白行を削除するfilterFiles()と、メソッドは次のようになります。

private def filterFiles(path: String, pattern: String, matcher: (String, String) => Boolean) = {
  val files = (new java.io.File(path)) listFiles
  for(file <- files if matcher(file.getName, pattern)) yield file
} 

そして、IDEはボディの両方の行でエラーを出します。最初の行のエラーは次のように述べています。

ambiguous reference to overloaded definition, both method listFiles in class File of type (x$1: java.io.FileFilter)Array[java.io.File] and method listFiles in class File of type 
 (x$1: java.io.FilenameFilter)Array[java.io.File] match argument types (Null)

2行目のエラーは次のように述べています。

illegal start of simple expression

printArray()また、メソッド内の3つの呼び出しすべてが、次のtest()ことも示しています。

type mismatch; found : Unit required: Array[?]

それはどういう意味ですか?コードアラインメントがコードフローを台無しにする可能性がある場合、ScalaはPythonのように動作することは想定されていません...では、filterFiles()メソッド本体の1行目と2行目の間の空白行を削除すると、どうしてこのような重大なエラーが発生するのでしょうか。それはどこかのバグですか、それともScalaのルールに直接従っていますか?注:;行の間に追加すると、すべてが整理されます。セミコロン推論のバグですか?

4

2 に答える 2

4

オブジェクトのメソッドが引数なしまたは単一の引数にできない場合は、次のように呼び出すことができます

val files = object method arg

または、スニペットで

val files = object method
  arg

あなたのコードでは、コンパイラはを返す引数として式をlistfiles使って呼び出したいと思っています。そして、それがこのタイプの議論で実装されていないことを不平を言います。空の行は、式を関数のパラメーターとして扱うことを防ぎますforArray[File]listFilesforlistFiles

于 2011-12-29T14:47:04.803 に答える
2

ご提案のとおり、セミコロン推論の問題のように見えます。括弧を省略した場合、コンパイラはメソッド引数を予期していると思います。セミコロンの代わりに、listFilesの後に括弧を追加できます。

val files = (new java.io.File(path)) listFiles ()
于 2011-12-29T14:46:18.750 に答える