8123


最近Scalaのソースを読んでいます。  
Scalatraを見ていたのですが、以下のように引数にアンダースコアをとるものがあるようです。これです → `url(_)`  
これは何を意味しており、どのような働きをしているのでしょうか？また、この文法に名前があれば教えてください。

[HttpExample.scala#L9](https://github.com/scalatra/scalatra-website-
examples/blob/master/2.2/http/scalatra-http-
demo/src/main/scala/org/scalatra/example/HttpExample.scala#L9)

[code]

    private def displayPage(title:String, content:Seq[Node]) = Template.page(title, content, url(_))
    
[/code]


CC BY-SA 3.0
2015-03-19T09:01:35.403
8120
2015-03-19T09:57:57.470
8918
question
scala
Scalaにおいて引数にアンダースコアを使用したときの挙動


こちらは部分適用の構文ですね。

[code]

    scala> def sum(a: Int, b: Int, c: Int): Int = a + b + c
    sum: (a: Int, b: Int, c: Int)Int
    
    scala> val f: (Int, Int) => Int = sum(_, 10, _)
    f: (Int, Int) => Int = <function2>
    
    scala> f(1, 2)
    res0: Int = 13
    
[/code]

このようにメソッドの引数の一部だけ引数を指定し、 _ で省略された引数のみをとる関数を生成したい時に作成します。

これと混同しすい構文として、引数全体を省略してメソッドから関数オブジェクトを作成する構文があります。

[code]

    scala> sum _
    res1: (Int, Int, Int) => Int = <function3>
    
[/code]

引数グループの括弧をつけずに、 メソッド名の後ろに _ をつけると、全ての引数をブランクとした関数オブジェクトを生成する事ができます。

質問のケースでは、[urlメソッドが沢山引数を持っている](https://github.com/scalatra/scalatra/blob/3a270f904d8e1079bb907bd8e46d52cf0a3582b7/core/src/main/scala/org/scalatra/ScalatraBase.scala#L647-L653)ため、第一引数のみをパラメータとして、残りの引数はデフォルト値を使ったファンクションを作成したい為に
url(_) を使っているものと思われます。


CC BY-SA 3.0
2015-03-19T09:43:39.660
8123
2015-03-19T09:57:57.470
2015-03-19T09:57:57.470
4037
4037
8120
answer