2011-12-29 13 views
3

EclipseのScala-IDEでScalaを学習しています。第9章:抽象化の制御、第1部:Scalaでのプログラミングのコード複製を減らしながら、私は本のコードを書いています(下記参照)。私が不要な空白行を削除し始めたとき、奇妙なことが起こりました。 filterFiles()メソッドの空白行を削除する前のコード全体を以下に示します。Scala-IDEまたはScalaの不適切な構文のあいまいさ

これはうまくいきます!しかし、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 

、今もこの教えtest()方法でprintArray()へのすべての3つの呼び出し:

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

どういう意味ですか?コードの配置がコードフローを壊す可能性がある場合、ScalaはPythonのように振舞うはずではありません...だから、filterFiles()メソッドの最初の行と2行目の空白行を削除すると、このような重大なエラーが発生します。どこかのバグですか、それともScalaのルールに直接従っていますか?注:行間に;を追加すると、すべてがソートされます。セミコロンの推論バグですか?

+0

これは、整列または空白に頼っていないという点でPythonと異なります。例えば、各ステートメントの最後にセミコロンを追加することができます。 – Philippe

+0

ええ、それは間違いなく覚えておくべきことです。 – noncom

答えて

4

すると、オブジェクトのメソッドはどれか一つの引数、あなたのスニペットで、

val files = object method arg 

ようにそれを呼び出すないか、ことができ

val files = object method 
    arg 

あなたのコードコンパイラでは、を返す記念碑としてfor式を持つlistfilesを呼び出したいと思っています。そして、listFilesはこのタイプの引数で実装されていないと不平を言う。空行は、forの式をパラメータとして扱いませんlistFiles関数

+0

ええと、私は他の関連する言語で空の行がこの種のトリックをすることができないことに気がつかなかった。 – noncom

+1

Scala IDEには[show inferred semicolons](http://scala-ide.org/docs/user/features/typingviewing.html#show-inferred-semicolons)という機能があります。この機能は、推論された現在のエディタではセミコロンを使用します。これは、このようなエラーを解決するのに役立ちます。 –

2

あなたが示唆するようにセミコロンの推論の問題のように見えますが、コンパイラは、括弧を外しておくと、メソッドの引数を期待しています。代わりにセミコロンの、あなたはLISTFILES後に括弧を追加することができます。

val files = (new java.io.File(path)) listFiles() 
関連する問題