2015-06-10 1 views
0

Данный код взято из 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) 
} 

Я не очень понимаю, как то же самое может быть сделано для классов-компаньонов

+0

Что вы подразумеваете под «как именно это работает»? Какое это соответствие шаблону? Как это называется? Не использовал Spark, но я бы просто добавил примечание, что 'private [csv]' означает, что он не должен использоваться вами, поэтому 'TypeCast.castTo (...)' невозможно из других пакетов. –

+0

re: private - не планируя использовать его, просто пытаясь понять, как это работает – EugeneMi

+0

Я знаю, что такое сопоставление с образцом, но обычно castType будет объектом какого-то типа, в данном случае это объект-компаньон. Поэтому вопрос заключается в том, как сопоставление шаблонов работает с объектами-компаньонами. – EugeneMi

ответ

0

Я никогда не работал с искрой, так что я не могу ответить с конкретными Искры знаний.

Но соответствие шаблону в вашем примере похоже на обычный шаблон.

castType - это экземпляр типа DataType, который имеет несколько подклассов, например. ByteType. Совпадение шаблонов просто проверяет, принадлежит ли объект castType к определенному классу (например, ByteType).

Поскольку существуют только одноточечные экземпляры нескольких подтипов, сопоставление не обязательно должно содержать экземпляр совпадений. Вот почему в матче используется только местозаполнитель _.

+0

это то, что castType не является экземпляром DataType (или любого из его подклассов) - это сопутствующий объект. Он называется TypeCast.castTo («abc», StringType) (не TypeCast.castTo («abc», новый StringType)) – EugeneMi