Странное поведение частично примененного определения класса прецедентов Scala

#scala

Вопрос:

Когда я пытаюсь применить частичную конструкцию класса case через ряд других классов, я получаю неожиданный (по крайней мере, для меня) результат.

Это scala 2.11.12

 
object PartiallyAppliedWeirdness {
 
   case class Person(dob: String)(name: String)

  class Born(dob: String) {
    def namingFunction: String => Person =  Person(dob)
  }

  class Naming(bornPerson: Born,name: String) {
    def namingFunction: Person = bornPerson.namingFunction (name)
  }


  def main(args: Array[String]): Unit = {
    val birth: Born = new Born("2010-01-01")
    val somPerson: Person = new Naming(birth, "Dave").namingFunction
    println(somPerson)
    println(somPerson.getClass)
  }
}

 

Результат

 Person(2010-01-01)
class PartiallyAppliedWeirdness$Person

 

Как это может быть! Может ли кто-нибудь объяснить, что здесь происходит?
Спасибо

Комментарии:

1. В строке 10 bornPerson.namingFunction возвращает функцию, которая принимает строку и возвращает человека, т. Е. String => Person . Строка 10 также передает строку в переменной name этой функции. Итак, мы получаем Person . В чем, собственно, заключается ваш вопрос?

2. итак, (name: String) часть определения класса обращения не является частью подписи класса обращения для сопоставления с образцом

3. Попробуйте val x = Person("x") , и текст ошибки будет содержать: «Неприменимые методы преобразуются в функции только тогда, когда ожидается тип функции». Мы можем сделать тип функции ожидаемым, добавив описание типа: val x: String => Person = Person("x")

4. Что касается сопоставления с образцом, (name: String) не распознается только потому, что способ, который def unapply(...) генерируется автоматически. Напишите свой собственный unapply() метод, и вы сможете получить и dob то, и name другое в соответствии с шаблоном.