Reputation: 462
I am new on Scala, I am test a script for converting measurements. it implement by implicit objects. I prepared it using REPL but when I tried to use in Eclipse Scala IDE there is a error indicats expected class or object definition convertir.scala /helloworld/src/main/scala line 12 Scala Problem
REPL does not report any error and it can be test:
$ 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>
In Scala IDE, implicit objects seem to have the error or it is not imported, the script and pictures is below. there is missing in a piece in Scala IDE for recreate same result that REPL.
Thanks experts!!
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))
}
Upvotes: 0
Views: 68
Reputation: 27535
implicit object
/implicit class
can (in Scala 2) only be a part of another object/class/package object. It is not allowed as top-level object.
In REPL it works because REPL is designed to allow experiments, and you can think that everything what you put there is under the hood put into some magical object and made accessible from it. The same is true about val
s and def
s - you cannot make them a top-level definitions but they just work in REPL.
Upvotes: 1