Solte no interpretador durante a localização arbitrária do código scala

Eu venho de um fundo em Python, onde em qualquer ponto do meu código eu posso adicionar

import pdb; pdb.set_trace() 

e em tempo de execução eu vou ser deixado em um intérprete interativo naquele local. Existe um equivalente para scala, ou isso não é possível em tempo de execução?

Sim, você pode, no Scala 2.8. Note que, para isso funcionar, você deve include o scala-compiler.jar no seu classpath. Se você invocar seu programa scala com scala , isso será feito automaticamente (ou assim parece nos testes que fiz).

Você pode então usá-lo assim:

 import scala.tools.nsc.Interpreter._ object TestDebugger { def main(args: Array[String]) { 0 to 10 foreach { i => breakIf(i == 5, DebugParam("i", i)) println(i) } } } 

Você pode passar vários argumentos DebugParam . Quando o REPL aparece, o valor à direita será vinculado a um val cujo nome você forneceu à esquerda. Por exemplo, se eu mudar essa linha assim:

  breakIf(i == 5, DebugParam("j", i)) 

Então a execução acontecerá assim:

 C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5 

Você continua a execução digitando :quit .

Você também pode cair incondicionalmente no REPL invocando break , que recebe uma List of DebugParam vez de um vararg. Aqui está um exemplo completo, código e execução:

 import scala.tools.nsc.Interpreter._ object TestDebugger { def main(args: Array[String]) { 0 to 10 foreach { i => breakIf(i == 5, DebugParam("j", i)) println(i) if (i == 7) break(Nil) } } } 

E depois:

 C:\Users\Daniel\Documents\Scala\Programas>scalac TestDebugger.scala C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5 scala> :quit 5 6 7 scala> j :5: error: not found: value j j ^ scala> :quit 8 9 10 C:\Users\Daniel\Documents\Scala\Programas> 

Para adicionar à resposta de Daniel, a partir do Scala 2.9, os methods break e breakIf estão contidos em scala.tools.nsc.interpreter.ILoop . Além disso, DebugParam agora é NamedParam .

IntelliJ IDEA:

  1. Executar no modo de debugging ou append um depurador remoto
  2. Defina um ponto de interrupção e corra até alcançá-lo
  3. Abra Evaluate Expression ( Alt + F8 , no menu: Executar -> Avaliar Expressão) janela para executar código Scala arbitrário.
  4. Digite qual fragment de código ou expressão você deseja executar e clique em Avaliar
  5. Digite Alt + V ou clique em Avaliar para executar o fragment de código.

Eclipse:

A partir do Scala 2.10, ambos break e breakIf foram removidos do ILoop .

Para entrar no intérprete, você terá que trabalhar diretamente com o ILoop .

Primeiro, adicione a biblioteca de scala compiler . Para o Eclipse Scala, clique com o botão direito em project => Build Path => Add Libraries... => Scala Compiler .

E então você pode usar o seguinte onde deseja iniciar o intérprete:

 import scala.tools.nsc.interpreter.ILoop import scala.tools.nsc.interpreter.SimpleReader import scala.tools.nsc.Settings val repl = new ILoop repl.settings = new Settings repl.settings.Yreplsync.value = true repl.in = SimpleReader() repl.createInterpreter() // bind any local variables that you want to have access to repl.intp.bind("row", "Int", row) repl.intp.bind("col", "Int", col) // start the interpreter and then close it after you :quit repl.loop() repl.closeInterpreter() 

No Eclipse Scala, o interpretador pode ser usado a partir da visualização do Console :