类型与涉及 scala.xml.elem 的 Binding.scala 不匹配



我未能编译一个简单的 Binding.scala示例,作为一个新手,我没有直觉如何修复它。也许自述文件有点过时了?https://github.com/ThoughtWorksInc/Binding.scala-sample 中的示例甚至更旧,并导致弃用警告。

我的代码,我基本上是从自述文件中粘在一起的,甚至简化了一点:

import com.thoughtworks.binding.dom
import org.scalajs.dom.document
import scala.scalajs.js.annotation.JSExport
@JSExport
object SampleMain {
@dom
def table = {
<table border="1" cellPadding="5">
<thead>
<tr>
<th>Name</th>
<th>E-mail</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
}
@JSExport
def main(): Unit = {
dom.render(document.body, table)
}
}

fastOptJS会导致编译错误:

SampleMain.scala:25:9: overloaded method value render with alternatives:
[error]   (parent: org.scalajs.dom.raw.Node,children: com.thoughtworks.binding.Binding[com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node]],dummy: Unit)Unit <and>
[error]   (parent: org.scalajs.dom.raw.Node,children: com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node])Unit <and>
[error]   (parent: org.scalajs.dom.raw.Node,child: com.thoughtworks.binding.Binding[org.scalajs.dom.raw.Node])Unit
[error]  cannot be applied to (org.scalajs.dom.raw.HTMLElement, scala.xml.Elem)
[error]     dom.render(document.body, table)
[error]         ^

我怀疑类型推断有问题,并尝试了这种类型注释:def table: com.thoughtworks.binding.Binding[org.scalajs.dom.html.Table]但这导致了另一个错误:

SampleMain.scala:11:6: type mismatch;
[error]  found   : scala.xml.Elem
[error]  required: com.thoughtworks.binding.Binding[org.scalajs.dom.html.Table]
[error]     (which expands to)  com.thoughtworks.binding.Binding[org.scalajs.dom.raw.HTMLTableElement]
[error]     <table border="1" cellPadding="5">
[error]      ^

我希望能解释一下这里出了什么问题。


解决方案:https://stackoverflow.com/a/55137909/1862339

事实证明,问题是在我的情况下没有选择paradise编译器插件。我仅在子项目中使用 Binding.scala 构建一个 SBT 多项目,addCompilerPlugin不会传播到子项目。要使其正常工作,需要将其添加到子项目的设置中,如下所示:

lazy val client = (project in file("client"))
.settings(
libraryDependencies ++= Seq(
"com.thoughtworks.binding" %%% "dom" % "11.6.0"
),
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
)
.enablePlugins(ScalaJSPlugin)

之前我在build.sbt的顶层addCompilerPlugin,这不起作用并导致编译错误。

检查是否已将其添加到build.sbt

addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)

Binding.scala的主宏(将 Scala XML 文字转换为特殊的Binding类型)如果没有这个插件就不起作用,编译器只能看到原始类型(scala.xml.Elem)。

这在自述文件Step 1中有所提及。

应该有一条错误消息,要求您启用paradise编译器插件。不幸的是,因为您使用的是 Scala 2.10,因此macro-compat中的错误会阻止您看到错误消息。

所以长答案是:

  1. 将 Scala 升级到 2.11 或 2.12,方法是在build.sbt中设置类似scalaVersion in ThisBuild := "2.12.8"的内容。
  2. 您将看到一条错误消息,要求您添加paradise插件。
  3. 最后,根据错误消息在build.sbt中添加以下设置:
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)

相关内容

  • 没有找到相关文章

最新更新