将方法添加到自定义类型

时间:2014-03-29 00:07:42

标签: scala slick

如果这个问题的措辞错误,我很抱歉,我对Scala和强类型语言都很陌生。

基本上我使用的是Slick,代码生成器为每个表输出以下行(在本例中为VideoCaptions表):

type VideoCaptionsRow = HCons[Int,HCons[Option[String],HCons[Option[Boolean],HCons[Option[Boolean],HCons[Option[String],HCons[java.sql.Timestamp,HCons[Int,HCons[Option[String],HNil]]]]]]]]
/** Constructor for VideoCaptionsRow providing default values if available in the database schema. */
def VideoCaptionsRow(id: Int, audioLanguage: Option[String] = None, hasCaptionFile: Option[Boolean] = Some(false), isDeleted: Option[Boolean] = Some(false), language: Option[String] = None, lastModified: java.sql.Timestamp, videoId: Int, regions: Option[String]): VideoCaptionsRow = {
  id :: audioLanguage :: hasCaptionFile :: isDeleted :: language :: lastModified :: videoId :: regions :: HNil
}

当我在VideoCaptions表上执行查询时,我得到一个VideoCaptionsRow类型的对象(显然是巨型HCons类型的简写)。我想为VideoCaptionsRow对象添加一个方法,以便我可以在查询结果行上调用它。有没有办法改变类型定义,这样它不仅仅是HCons类型的简写,还包括一个额外的方法,同时Slick内部仍然可以使用它?

1 个答案:

答案 0 :(得分:2)

您可以定义一个隐式类来扩展自己代码中的功能。无需更改代码生成器。

implicit class VideoCaptionsRowExtensions(row: VideoCaptionsRow){
  def foo = row(0) // <- e.g. alias the first HList entry as def foo, or compute something
}
VideoCaptions.filter(...).run.map(_.foo) // access new member `foo`