Видимость аргумента вторичного конструктора Scala

Я просто заметил, что когда у меня есть

case class Foo(bar : String)(val baz : String) 

Я не могу получить доступ к базе, если ссылки на Foo в другом пакете. Можно ли что-то с этим сделать или мне просто нужно уступить и добавить аксессор?

2 ответа

Вот для чего нужны REPL!

scala> case class Foo(bar: String)(val baz: String)
defined class Foo

scala> val foo1 = Foo("goo")("snoo")
foo1: Foo = Foo(goo)

scala> foo1.baz
res0: String = snoo

Но знайте, что baz здесь не участвует в copyequals, hashCode или же toString (как вы видите выше), поэтому используйте дополнительные списки параметров конструктора класса case с осторожностью.

Кроме того, это не "вторичный конструктор".

доказательство

package here {
  case class Foo(bar: String)(val baz: String)
}

package there {
  import here._

  object SnooSnoo {
    def main(args: Array[String]): Unit = {
      val foo2 = Foo("flew")("too")

      println(s"foo2=$foo2; foo2.baz=${foo2.baz}")
    }
  }
}

% sbt
> run
[info] Compiling 1 Scala source to /Users/rschulz/Projects/scribble/target/scala-2.10/classes...
[info] foo2=Foo(flew); foo2.baz=too
[success] Total time: 5 s, completed Jan 4, 2014 2:07:14 PM

На самом деле, похоже, что это просто ошибка в плагине IntelliJ Scala.

Другие вопросы по тегам