programista4k
programista4k

Reputation: 45

Object inside class

Scala 2.12
What is wrong with my implementation?

object MyJob extends DatasetReader(x=x) {
  val x = "aaa"
  DatasetReader.read()
}

class DatasetReader(x: String) {
  object DatasetReader {
    def read(): String = {
       // ...
    }
  }
}

error:

super constructor cannot be passed a self reference unless parameter is declared by-name

How to fix it?

Upvotes: 0

Views: 141

Answers (2)

Dmytro Mitin
Dmytro Mitin

Reputation: 51703

Try

val x = "aaa"

object MyJob extends DatasetReader(x=x) {
  DatasetReader.read()
}

https://scastie.scala-lang.org/DjB31943QxujtmfrzLa3tg

I guess you can do what you want with early initializer

object MyJob extends {
  val x = "aaa"
} with DatasetReader(x=x) {
  DatasetReader.read()
}

https://scastie.scala-lang.org/r6FYtxXeT1SFcFHX6KFM1A

Please notice that early initializers are deprecated in Scala 3

http://dotty.epfl.ch/docs/reference/dropped-features/early-initializers.html

Upvotes: 1

Tomer Shetah
Tomer Shetah

Reputation: 8539

Another option you have is:

object MyJob extends {
  val x = "aaa"
} with DatasetReader(x) {
  DatasetReader.read()
}

Code run at Scastie.

There are similar post in StackOverflow, issue in github, and a bug in Scala.

Upvotes: 2

Related Questions