Чтобы получить объект-компаньон в Scala, класс и его объект-компаньон должны быть определены в одном файле. Похоже, это то, что вы делаете, особенно когда вы не используете переводчик.
Однако, когда вы интерпретируете код построчно в Scala, он оборачивает его в дополнительный анонимный объект, чтобы выражения могли быть определены без явных классов или объектов в REPL ( подробнее здесь ).
Вот иллюстрация проблемы обтекания:
Не работает:
$ scala
Welcome to Scala version 2.10.6 (OpenJDK 64-Bit Server VM, Java 1.8.0_222).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class A {
| private val privateVal = 1
| }
defined class A
scala> object A extends App{
| println(new A().privateVal)
| }
<console>:9: error: value privateVal in class A cannot be accessed in A
println(new A().privateVal)
^
Работает, если определено одновременно с использованием :paste
:
scala> :paste
// Entering paste mode (ctrl-D to finish)
// Script A.scala
class A {
private val privateVal = 1
}
object A extends App{
println(new A().privateVal)
}
// Exiting paste mode, now interpreting.
defined class A
defined module A
Кстати, я не вижу этой проблемы при запуске scala A.scala
. Возможно, я использую другую версию или настройки.
Если вы не можете использовать режим вставки или не можете заставить интерпретатор читать весь файл сразу, обходной путь - обернуть ваш код в любой объект, чтобы заставитьинтерпретация одного кодового блока:
scala> object Workaround {
| class A {
| private val privateVal = 1
| }
| object A extends App{
| println(new A().privateVal)
| }
| }
defined module Workaround