【问题标题】:Generate Scala Source from Twirl Template从 Twirl 模板生成 Scala 源代码
【发布时间】:2015-11-07 06:23:47
【问题描述】:

我知道play-twirl 用于生成包含可在运行时调用的模板函数的 Scala 源代码。

有没有办法用 play-twirl 生成任意 Scala 源文件?

例如
我想通过创建一个模板来自动创建一些繁琐的方法签名

src/main/twirl/Foos.scala.scala

object Foos {
  @for(i <- 2 to 22){
  def foo@i[@(...)](chain: @(...)) = @(...)
  }
}

并且有一个由 SBT 生成的源文件,比如

src_managed/main/scala/Foos.scala

object Foos {
  def foo2[A1, A2](chain: A1 ~ A2) = chain match { case a1 ~ a2 => (a1, a2) }
  def foo3[A1, A2, A3](chain: A1 ~ A2 ~ A3) = ...
  ....
  def foo22[A1, ..., A22] ....
}

基于some of the Playframework library sources,看起来他们正在使用自己的模板框架来做类似的事情,尽管它似乎不是自动化的。

所以重申一下这个问题,Twirl 可以进行这种设置吗?是否有替代 sbt 插件可以让这种事情变得更容易?

【问题讨论】:

    标签: scala sbt twirl


    【解决方案1】:

    由于没有编写我自己的 SBT 逻辑,Twirl 似乎无法做到我想要的。

    我确实在sbt-boilerplate 中找到了一个有用的替代方案。使用该插件,我可以完全实现我想要的。

    src/main/boilerplate/Foos.scala.template

    object Foos {
      [2..22#def foo1[[#A1#]](chain: [#A1# ~ ]) = chain match { case [#a1# ~ ] => ([#a1#]) }
      #]
    }
    

    扩展到

    target/scala-2.xx/src_managed/main/Foos.scala

    object Foos {
      def foo2[A1, A2](chain: A1 ~ A2) = chain match { case a1 ~ a2 => (a1, a2) }
      def foo3[A1, A2, A3] ...
      ...
      def foo22[A1, ..., A22] ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 2014-07-14
      • 2013-05-04
      • 2011-11-05
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多