3

なぜ scala が時々 args を anon fns に名前を付ける必要があるのか​​理解できません:

scala> case class Person(name: String)
defined class Person

scala> def reverseString(s: String) = s.reverse
reverseString: (s: String)String

scala> val p = Some(Person("foo"))
p: Some[Person] = Some(Person(foo))

scala> p map { reverseString(_.name) }
<console>:12: error: missing parameter type for expanded function ((x$1) => x$1.name)
              p map { reverseString(_.name) }

// why does it only work when I name the argument? I'm not even telling it the type.
scala> p map { p => reverseString(p.name) }
res9: Option[String] = Some(oof)

// and shouldn't this fail too?
scala> p map { _.name.reverse }
res13: Option[String] = Some(oof)
4

2 に答える 2

4

答えはエラーメッセージにありますが、暗号的には次のとおりです。

(x$1) => x$1.name

待って、何?あなたが欲しかっx$1 => reverseString(x$1.name)た。

これで、何が間違っていたのかが正確にわかりました。関数が括弧にあると想定されていましたreverseString(つまり、関数を に渡したいreverseString)。変数に明示的に名前を付けることで、それが間違っていたことを示します。

(関数を渡す必要があると想定すると、実際には関数ではなく文字列が必要reverseStringなため、その関数を作成するタイプがわからないため、そのメッセージが表示されます。)reverseString

于 2012-10-04T19:33:41.233 に答える
0

これが型推論と呼ばれるものだと思います。また、_ は単なるプレースホルダーです。(すでに p を Some[Person] 型として定義しているため、コンパイラは、あなたが行った方法で使用すると、それを理解するのに十分スマートです)

于 2012-10-04T19:31:58.123 に答える