Sbt 类型与涉及scala.xml.Elem的Binding.scala不匹配
我没有编译一个简单的Binding.scala的例子,作为一个新手,我没有直觉知道如何修复它。也许自述有点过时了?上的示例甚至更旧,会导致弃用警告 我的代码基本上是从自述文件中拼凑起来的,甚至简化了一点:Sbt 类型与涉及scala.xml.Elem的Binding.scala不匹配,sbt,scala.js,binding.scala,Sbt,Scala.js,Binding.scala,我没有编译一个简单的Binding.scala的例子,作为一个新手,我没有直觉知道如何修复它。也许自述有点过时了?上的示例甚至更旧,会导致弃用警告 我的代码基本上是从自述文件中拼凑起来的,甚至简化了一点: import com.thoughtworks.binding.dom import org.scalajs.dom.document import scala.scalajs.js.annotation.JSExport @JSExport object SampleMain { @
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)
}
}
我怀疑类型推断有问题,并尝试了以下类型注释: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] ^
SampleMain.scala:11:6:类型不匹配;
找到[错误]:scala.xml.Elem
[错误]必需:com.thoughtworks.binding.binding[org.scalajs.dom.html.Table]
[错误](扩展为)com.thoughtworks.binding.binding[org.scalajs.dom.raw.HTMLTableElement]
[错误]
[错误]^
我希望你能解释一下这里出了什么问题
解决方案:检查您是否已将其添加到您的
build.sbt
addCompilerPlugin(“org.scalamacros”%“paradise”%“2.1.0”cross CrossVersion.full)
如果没有此插件,Binding.scala
(将scala XML文本转换为特殊的Binding
类型)的主宏无法工作,编译器只能看到原始类型(scala.XML.Elem
)
这在自述文件的
步骤1
中提到。应该有一条错误消息,要求您启用paradise
编译器插件。不幸的是,由于您使用的是Scala 2.10,因此无法看到错误消息
因此,长话短说的答案是:
build.sbt
中设置类似于scalaVersion的东西,在这个构建中:=“2.12.8”
paradise
插件build.sbt
中添加以下设置:原来问题是在我的例子中没有使用
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
,但它不起作用,导致了编译错误。感谢您将我推向正确的方向!我的构建有点复杂,我确实(尝试)配置了编译器插件,但它不正确(参见我自己的答案)。您的见解确实帮助我理解了这个问题。实际上,我正在使用Scala 2.12,但没有看到有用的错误消息。可能是因为我使用的是SBT多项目构建?无论如何,编译器插件是我需要的提示,我修复了SBT中的一个错误配置(参见我的答案)。谢谢
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
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)