Ken points out that my example of
lift
importing the members of the net.liftweb.util.Helpers
"class" maps exactly to the corresponding Java import. I waved my hands around the fact that Helpers
is actually an object
, which is, simultaneously and at the same time, Scala's way of denoting a singleton and providing static members (all of the members of an object
are effectively static). But it turns out that the import
syntax I was bragging about works precisely because Helpers
is an object
and not a class
.Here's some lame, contrived, forced-example, somewhat-minimal Scala code to demonstrate:
Mixee.scala
package bogus;
class Mixee {
def weird: String = {"Weird Al!"}
def twentySeven: String = {"27!"}
}
Mixer.scala
package bogus;
import Mixee._;
object Mixer {
def main(args: Array[String]): Unit = { Console.println(weird); Console.println(twentySeven) }
}
As described here,
Mixer.scala
will refuse to compile, with the error: "not found: value Mixee". This is because Mixee is defined as a class
. Change class
to object
and it compiles (and runs) just fine.Bonus Discovery: While researching this, I also learned that Eclipse with the Scala plugin is not as smart as it should be about building my bogus project. If I start with a clean compile (i.e., defining Mixee as an object), Eclipse is happy. If I then change the definition of Mixee from
object
to class
, the error doesn't show up until I force a rebuild by selecting Project -> Clean... If I then change class
back to object
, the error goes away without my forcing the rebuild.Anyone got a line on that? Ken? Anyone?
Anyway, just for the record, my purpose with these posts is not to bury Java, but to praise Scala and learn how it's different. I'll leave the determination of whether Scala is "better" than Java up to you, my readers. Both of you (hi, Mom!). ;-)
2 comments:
one powerful feature of Scala's import is aliasing:
Welcome to Darwin!
computer:~ user$ scala
Welcome to Scala version 2.6.0-final.
Type in expressions to have them evaluated.
Type :help for more information.
scala> import java.util.{ArrayList => SomeOtherName}
import java.util.ArrayList=>SomeOtherName
scala> val x = new SomeOtherName
x: java.util.ArrayList = []
scala> x add 3
res0: Boolean = true
scala> println(x)
[3]
scala> import x._
import x._
scala> add(5)
res3: Boolean = true
scala> println(x)
[3, 5]
You may also want to make use of Scala's type inference; I believe this is a minimal version of your Mixee class:
class Mixee {
def weird = "Weird Al!"
def twentySeven = "27!"
}
Post a Comment