Scala REPL закрывается автоматически

Scala REPL ведет себя странно или, возможно, это ожидаемое поведение. Когда я создаю объект MainFrame и устанавливаю его видимость в true, отображается окно. Однако, если я закрою окно, Scala REPL выйдет на терминал. Пример сеанса:

 ~$ scala
 scala> import swing._
 scala> val frame = new MainFrame()
 scala> frame.visible = true
 ~$                             //when I close the window

Я использую scala 2.9.1 на kubuntu.


person Jamil    schedule 06.09.2011    source источник


Ответы (2)


Это сам класс MainFrame в сочетании с не очень-OO поведением System.exit.

Это весь источник MainFrame:

class MainFrame extends Frame {
  override def closeOperation() { sys.exit(0) }
}

Глядя на это, становится совершенно ясно, что когда окно закрывается, вызывается System.exit и JVM завершает работу.

Если вы просто экспериментировали, когда обнаружили это, обходной путь — просто не делать этого! Если вы хотите использовать фрейм в REPL, вы можете либо переопределить closeOperation, чтобы не выходить из JVM, либо просто использовать Frame (поскольку единственная дополнительная функциональность с MainFrame - это поведение выхода JVM).

person Andrzej Doyle    schedule 06.09.2011

Как сказано в документации:

Закрывает платформу и закрывает приложение при закрытии.

(То есть он отключает JVM, в которой работает REPL.)

Чтобы предотвратить такое поведение, вы можете либо просто использовать Frame, либо переопределить метод closeOperation.

Вот источник MainFrame.scala для справки:

/**
 * A frame that can be used for main application windows. Shuts down the
 * framework and quits the application when closed.
 */
class MainFrame extends Frame {
  override def closeOperation() { sys.exit(0) }
}
person aioobe    schedule 06.09.2011