Pete
Pete

Reputation: 17132

Why do IntelliJ worksheets mess with the class name?

You would think a class named "Foo" would actually be named "Foo", but apparently not:

class Foo {
  val bar = 5
  val name = this.getClass.getName
  def pkg = this.getClass.getPackage.getName
}

val q = new Foo()

println(s"The name is ${q.name}")

However, it is not:

defined class Foo

q: Foo = Foo@31e64c64

The name is $line111.$read$$iw$$iw$Foo

Can anyone explain what the IntelliJ Scala Worksheet is doing here?

(And if you were wondering, pkg: String = $line111)

Upvotes: 0

Views: 48

Answers (1)

Jörg W Mittag
Jörg W Mittag

Reputation: 369458

It looks like the Worksheet uses a similar approach to the Scala REPL, namely to wrap each line into a separate, nested object.

The reason this is done this way, is that by the standard Scala semantics, a lot of things you would want to do in a REPL / Worksheet would be illegal. For example, you want to redefine a class when you realize you made a mistake:

class Foo {
  def baR(x: Int) = x
}

// Oops! Typo.

class Foo {
  def bar(x: Int) = x
}
// error: Foo is already defined as class Foo
// class Foo {
//       ^

If the REPL or Worksheet had the same semantics as Scala, you wouldn't be able to fix typos, redefine vals, etc. Therefore, the code is instead compiled as if each line / declaration were a separate object, with some clever nesting, and importing.

Upvotes: 4

Related Questions