【问题标题】:Scala Script works in REPL but it fails on Scala IDEScala Script 在 REPL 中工作,但在 Scala IDE 上失败
【发布时间】:2020-07-07 05:27:55
【问题描述】:

我是 Scala 的新手,我正在测试一个用于转换测量值的脚本。它由隐式对象实现。我使用 REPL 准备它,但是当我尝试在 Eclipse Scala IDE 中使用时,出现错误指示 expected class or object definition convertir.scala /helloworld/src/main/scala line 12 Scala Problem

REPL 不报任何错误,可以测试:

$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.

scala> trait Convertir[C] { def conversion(c:C): Double }
defined trait Convertir

scala> case class InchToFoot(inc: Double)
defined class InchToFoot

scala> case class MileToKm(mil: Double)
defined class MileToKm

scala> case class PoundToKilo(pnd: Double)
defined class PoundToKilo

scala> implicit object Foot extends Convertir[InchToFoot] { override def conversion(foot:InchToFoot): Double = { foot.inc/12 }}
defined object Foot

scala> implicit object Km extends Convertir[MileToKm] { override def conversion(km:MileToKm): Double = { km.mil*1.609344 }}
defined object Km

scala> implicit object Kilo extends Convertir[PoundToKilo] { override def conversion(kilo:PoundToKilo): Double = { kilo.pnd*0.45359237 }}
defined object Kilo

scala> def convertirA[C](convertir: C)(implicit converImpl: Convertir[C]) : Double = converImpl.conversion(convertir)
convertirA: [C](convertir: C)(implicit converImpl: Convertir[C])Double

scala> convertirA(new InchToFoot(10))
res0: Double = 0.8333333333333334

scala> convertirA(new MileToKm(10))
res1: Double = 16.09344

scala> 

在Scala IDE中,隐式对象似乎有错误或没有导入,脚本和图片如下。 Scala IDE 中缺少用于重新创建与 REPL 相同的结果的部分。

感谢专家!!


trait Convertir[C] { def conversion(c:C): Double }

case class InchToFoot(inc: Double)
case class MileToKm(mil: Double)
case class PoundToKilo(pnd: Double)

implicit object Foot extends Convertir[InchToFoot] { 
  override def conversion(foot:InchToFoot): Double = { foot.inc/12 }}
implicit object Km extends Convertir[MileToKm] { 
  override def conversion(km:MileToKm): Double = { km.mil*1.609344 }}
implicit object Kilo extends Convertir[PoundToKilo] { 
  override def conversion(kilo:PoundToKilo): Double = { kilo.pnd*0.45359237 }}

def convertirA[C](convertir: C)(implicit converImpl: Convertir[C]) : Double = converImpl.conversion(convertir)

object Main3 extends App {
  convertirA(new InchToFoot(10))
  convertirA(new MileToKm(10))
  convertirA(new PoundToKilo(10))
}

【问题讨论】:

  • 没有太多答案,但您可能不应该使用基于 Eclipse 的 Scala IDE,因为它的最新版本是 2017 年。尝试使用 Scala 插件或 VSCode 或一些文本查看 Intellij Idea编辑器 + 金属语言服务器。

标签: eclipse scala read-eval-print-loop


【解决方案1】:

implicit object/implicit class(在 Scala 2 中)只能是另一个对象/类/包对象的一部分。不允许作为顶级对象。

在 REPL 中它之所以有效,是因为 REPL 旨在允许进行实验,并且您可以认为您在其中放置的所有内容都在引擎盖下放入了某个神奇的对象并可以从中访问。 vals 和 defs 也是如此 - 您不能将它们设为顶级定义,但它们只能在 REPL 中使用。

【讨论】:

  • 感谢您的回复,包括隐式,我是否必须在外部 *.class 中创建并以某种方式导入?他们可以在同一个班级上创建吗?
  • 您必须将它们放入某个对象中。如果这是 Convertir 的伴随对象(或 Convertir[X]X 的伴随对象),它们将被自动导入,如果这是任何其他对象,您必须手动导入它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多