2014-01-03 2 views
0

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

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

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

ответ

0

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

+0

Coorect. IDEA не соответствует языку, поскольку ScalaIDE. –

+0

Тогда почему вы тратили много времени на то, чтобы сказать мне вещи, совершенно не относящиеся к проблеме, и спорить по терминологии? – user1063042

+0

Помимо тега, где вы упомянули IDEA? –

1

Это то, что REPL's для!

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 (как вы видите выше), поэтому использовать дополнительные списки параметров конструктора класса случая с осторожностью.

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

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

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 
+0

REPL ничего не говорит в этом случае, потому что в вашем примере весь код находится в одном пакете. Пожалуйста, внимательно прочитайте, потому что ваш ответ совсем не соответствует моему вопросу. И да, эти аргументы являются «вторичной» частью конструктора. Если вы посмотрите на базовый класс Java, который сгенерирован, они все являются частью конструктора. Например, случае класс Foo (х: Int) (значение у: Int) становится общественного класса Foo реализует scala.Product, scala.Serializable { ... общественного Foo (INT, INT); ... } – user1063042

+0

Размещение пакета не имеет к этому никакого отношения. И «вторичный конструктор» - это полностью отдельный конструктор, определенный внутри тела класса, а не второй список аргументов для основного конструктора, что и было показано вами. Естественно, JVM не имеет нескольких списков аргументов, будь то для конструкторов или методов, поэтому Scala должен компилироваться в список одиночных аргументов, доступных в базовой виртуальной машине. –

+0

Ну, тогда ** почему я вижу ошибку, что поле не существует **? Или вы пропустили эту часть моего вопроса? Если это не ошибка в IntelliJ, как я и предложил. Все, что вы написали, не имеет никакого отношения к рассматриваемой проблеме и чисто бранное карма, а не пытается решить настоящий вопрос **. – user1063042

Смежные вопросы