2015-07-16 2 views
2

Учитывая эти тематические классы:Почему это Scala-заполнитель не работает

case class FeatureDistance(id: Long, distance: Double) 

case class SearchResult(score: Float, id: Long) 

Почему это не компилировать?

val distances = List[FeatureDistance](FeatureDistance(1L, 10f)) 
val results = distances.map(SearchResult(0f, _.id)) 

Но это делает:

val results = distances.map(fd => SearchResult(0f, fd.id)) 

Ошибка компиляции говорит: missing parameter type for expanded function ((x$3) => x$3.id)

Это потому, что _ только область действия функции карты, так что не видно в SearchResult.apply вызова?

+0

Я только что столкнулся с этим на днях. Я понятия не имею, почему так, но я подозреваю, что это связано с определением символа подчеркивания. Так как это действительно только синтаксический сахар, это не имеет значения для вашей реальной производительности. – childofsoong

ответ

1

После этого немногих исследований, я нашел post on the old scala forums, который содержит эту цитату:

При использовании «_» в качестве держателя места для анонимного параметра функции, сфера этой функции содержащую его самую внутреннюю скобку.

Итак, это вопрос вопроса. Я подозреваю, что это связано с проблемами, которые в противном случае могут возникнуть из-за наличия вложенных вызовов функций, которые используют более одного подчеркивания. Например:

//suppose we have some x:List[List[Int]] 
x.map(_.map(_ + 1)) 
+0

Да, это то, что я думал, это интересно, потому что мы могли бы сделать что-то вроде x.map (y => y.map (y => y + 1)) - хотя мы, вероятно, будем снимать за это! : D –

+0

Это было бы ужасно! – childofsoong

Смежные вопросы