Данный код взято из Spark SQL. Он выполняет извлечение, но castType
является сопутствующим объектом - его можно назвать TypeCast.castTo("abc", StringType)
. Может ли кто-нибудь объяснить, как работает шаблон с объектами-компаньонами под капотом?Scala extract/pattern matching with companion object
private[csv] def castTo(datum: String, castType: DataType): Any = {
castType match {
case _: ByteType => datum.toByte
case _: ShortType => datum.toShort
case _: IntegerType => datum.toInt
case _: LongType => datum.toLong
case _: FloatType => datum.toFloat
case _: DoubleType => datum.toDouble
case _: BooleanType => datum.toBoolean
case _: DecimalType => new BigDecimal(datum.replaceAll(",", ""))
case _: TimestampType => Timestamp.valueOf(datum)
case _: DateType => Date.valueOf(datum)
case _: StringType => datum
case _ => throw new RuntimeException(s"Unsupported type: ${castType.typeName}")
}
}
ДОБАВЛЕНО: Основываясь на моем понимании extractin/шаблон согласования, как правило, реализуется с помощью метода Исключить объекта-компаньона. Это пример того, как тематические классы implemented under the hood
trait User {
def name: String
}
class FreeUser(val name: String) extends User
class PremiumUser(val name: String) extends User
object FreeUser {
def unapply(user: FreeUser): Option[String] = Some(user.name)
}
object PremiumUser {
def unapply(user: PremiumUser): Option[String] = Some(user.name)
}
Я не очень понимаю, как то же самое может быть сделано для классов-компаньонов
Что вы подразумеваете под «как именно это работает»? Какое это соответствие шаблону? Как это называется? Не использовал Spark, но я бы просто добавил примечание, что 'private [csv]' означает, что он не должен использоваться вами, поэтому 'TypeCast.castTo (...)' невозможно из других пакетов. –
re: private - не планируя использовать его, просто пытаясь понять, как это работает – EugeneMi
Я знаю, что такое сопоставление с образцом, но обычно castType будет объектом какого-то типа, в данном случае это объект-компаньон. Поэтому вопрос заключается в том, как сопоставление шаблонов работает с объектами-компаньонами. – EugeneMi