Преобразовать кортеж в класс case со значениями по умолчанию - PullRequest
3 голосов
/ 11 февраля 2020
case class Person(first: String, last: String, full: String = "blah")

val one = Person("Rachel","Green")
// one: Person = Person(Rachel,Green,blah)

val tuple1 = ("Ross","Geller")
// tuple1: (String, String) = (Ross,Geller)

Person tupled tuple1
// <console>:15: error: type mismatch;  found : (String, String)  required: (String, String, String

Я хочу преобразовать Tuple13 в класс дел со значением по умолчанию.

1 Ответ

2 голосов
/ 11 февраля 2020

Попробуйте предоставить apply фабричный метод в компаньоне

object Person {
  def apply(t: (String, String)): Person = Person(t._1, t._2)
}
Person(tuple1)   // res2: Person = Person(Ross,Geller,blah)

или, возможно, неявное преобразование

implicit def tupledWithDefaults(t: (String, String)) = (t._1, t._2, Person.$lessinit$greater$default$3)
Person.tupled(tuple1)   // res2: Person = Person(Ross,Geller,blah)

Странно выглядящий $lessinit$greater$default$3 - это хакерский способ доступа к настройкам по умолчанию Scala дополнительный конструктор без аргументов плюс параметры конструктора по умолчанию

...