0

在 Scala Play Framework 2 项目的视图中,我想逐字显示一段源代码,如下所示:

@if(true) { "The world has ended!" }

接着是编译结果:

"The world has ended!"

String我想通过定义一个接受包含片段的方法来做到这一点,并输出两个版本,如下所示:

@sideBySide(content: String) = {
  content -> eval(content)
}

我会这样称呼它:

@sideBySide("""@if(false) { "The world has ended!" }""")

所以问题是怎么写eval

4

1 回答 1

0

首先,免责声明,我真的希望您了解通过提供类似 js 的 eval 会打开什么样的蠕虫,并且您已经非常仔细地考虑过这一点。:)

我在一个小项目中重用了 Scala 控制台,以便能够在 Deck.js 演示文稿中评估 Scala 代码,这是代码,应该可以帮助您找出一种方法(恐怕我可以'不完全回忆类加载器 trixery 背后的基本原理):

val settings: Settings = {

  lazy val urls = java.lang.Thread.currentThread.getContextClassLoader match {
    case cl: java.net.URLClassLoader => cl.getURLs.toList
    case _ => sys.error("classloader is not a URLClassLoader")
  }

  lazy val classpath = urls map {_.toString}

  val tmp = new Settings()
  tmp.bootclasspath.value = classpath.distinct mkString File.pathSeparator
  tmp
}

val interpreter = new IMain(settings)

def unsafeEval(source: String): String = 
  stringFromStream { sout =>
     Console.withOut(sout) {
       interpreter.interpret(source)
     }
  }

// lets someone write to a stream and then we return the string contents of that stream
def stringFromStream(f: (OutputStream) => Any): String = {
  val out = new ByteArrayOutputStream
  f(out)
  out.toString("UTF-8")
}
于 2013-10-28T16:31:29.687 回答