2013-01-24 12 views
6

私はScalaを学び始めています。私はそれほど理解していないScalaのProgramming textbookのスニペットを見てきました。誰かが私を助けることを望んでいたのですか?Scalaの理解:引数としての関数の受け渡し

これは、Programming in Scala、2nd Editionのリスト9.1のものです。

object FileMatcher { 
    private def filesHere = (new java.io.File(".")).listFiles 
} 

private def filesMatching(matcher: String => Boolean) = 
    for (file <- filesHere; if matcher(file.getName)) yield file 

def filesEnding(query: String) = 
    filesMatching(_.endsWith(query)) // ??? 

def filesContaining(query: String) = 
    filesMatching(_.contains(query)) // ??? 

def filesRegex(query: String) = 
    filesMatching(_.matches(query)) // ??? 

私は少し// ???を持つ行と混同しています。 _を使用すると、何らかの形でfilesMatchingに渡される匿名関数が作成されますか?または、_はこれとは関係がなく、代わりにfilesMatchingには関数が必要なので、式として_.endsWith(query)を実行せず、その式を関数にしますか?

+1

上記の '// ???'の行はありません。あなたはそれらを追加するのを忘れたのでしょうか? –

+0

申し訳ありませんが、 '//???'を今追加しました。 – C0deAttack

+0

[Scala \ _プレースホルダ(このコードはどのように機能しますか?)]の複製が可能です(http://stackoverflow.com/questions/6880407/scala-placeholders-how-does-this-code-function) –

答えて

14

拡張定義

匿名関数は、例えば

(a: A, b: B, ...) => function body //using a, b, ... 

として、それらのより詳細かつ完全な形で、定義されています

(a: String, b: String) => a ++ b // concatenates 2 Strings 

推論されたタイプの

コンテキストは(高階関数は、その関数の引数のための特定のシグネチャを期待するときのように)必要な情報を提供する場合、あなたはパラメータタイプを省略することができ、 as

(a, b, ...) => function body //using a, b, ... 

val l = List(1, 2, 3) 

//you can omit the type because filter on List[Int] expects a (Int => Boolean) 
l.filter(i => i < 3) 

プレースホルダの構文

あなたのパラメータは関数本体で、あなたがそれらを宣言することを一度それぞれと同じ順序で使用されている場合は最後に、あなたのように、まだ短い形式を使用することができます

_ ++ _ // which is equivalent to (a, b) => a ++ b 

_は、関数の引数のプレースホルダです

など。

filesMatchingの引数は、あなたがこのような操作は、最高の機能の種類を定義することによって行われる

_.endsWith(query) // equivalent to (s: String) => s.endsWith(query) 
_.contains(query) // equivalent to (s: String) => s.contains(query) 
_.matches(query) // equivalent to (s: String) => s.matches(query) 
3

ここで使用される_は、関数の引数の省略形です。したがって、filesMatching(_.endsWith(query))filesMatching(f => f.endsWith(query))に相当します。 filesMatchingは、引数としてString => Booleanの機能を持っているので、fはここでStringであると予想されます。ですから、この表現は無名関数です

0

を使用することができますタイプString => Booleanの関数です。私は優れたデモを見つけたhere。この投稿と組み合わせて、デモンストレーションは関数を引数として渡すためのベストプラクティスを明確にする必要があります。

関連する問題