#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
другое в соответствии с шаблоном.