Видимость аргумента вторичного конструктора 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
здесь не участвует в copy
equals
, 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.