我正在开设一个包含HTML正文内容,<head>
内容和结尾内容的课程。我希望能够轻松地将后两个表单前置并附加到文档生成时,由trait Resource
推广。
现在,代码类似于此问题底部的代码,我可以multipartHtml :+ resource
,multipartHtml ++ optionResource
,multipartHtml ++ resources
,resource +: multipartHtml
(对于您可能的类型)推断。我已将以下内容添加到MultipartHtml伴侣对象中,可以resources ++ multipartHtml
:
implicit class RichResources(resources: GenTraversableOnce[Resource]) {
def ++(that: MultipartHtml): MultipartHtml = resources.foldRight(that)(_ +: _)
}
但这不会让我optionResource ++ multipartHtml
,因为Option
不是GenTraversableOnce
。
除了重复Option
的内容之外,是否有更好的方法可以一次性捕获Option
和GenTraversableOnce
次转换?我尝试了implicit class RichResources[T <% GenTraversableOnce](resources: T[Resource])
和implicit class RichResources[T[_] <% GenTraversableOnce[_](resources: T[Resource])
,没有运气。如果还有其他方法,除了implicit class
之外,我还会接触其他方法来完成此结果。
以下是更多上下文代码:
import play.api.templates.Html
case class MultipartHtml(bodyMarkup: Html, headTags: Seq[String], footerTags: Seq[String]) {
import MultipartHtml._
def ++(resources: GenTraversableOnce[Resource]): MultipartHtml = resources.foldLeft(this)(_ :+ _)
def :+(resource: Resource): MultipartHtml = resource match {
case s: HeadTag => MultipartHtml(bodyMarkup, (headTags :+ s.toString).distinct, footerTags)
case s: ScriptTag => MultipartHtml(bodyMarkup, headTags, (footerTags :+ s.toString).distinct)
case _ => this
}
def +:(resource: Resource): MultipartHtml = resource match {
case s: HeadTag => MultipartHtml(bodyMarkup, (s.toString +: headTags).distinct, footerTags)
case s: ScriptTag => MultipartHtml(bodyMarkup, headTags, (s.toString +: footerTags).distinct)
case _ => this
}
}
object MultipartHtml {
/** A resource that can be imported in the HTML head or footer*/
trait Resource
// ... case classes implementing Resource
}