私は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のルールに直接従っていますか?注:;
行の間に追加すると、すべてが整理されます。セミコロン推論のバグですか?