Vengo de un fondo de Python, donde en cualquier punto de mi código puedo agregar
import pdb; pdb.set_trace()
y en tiempo de ejecución me dejarán en un intérprete interactivo en ese lugar. ¿Existe un equivalente para scala o esto no es posible en tiempo de ejecución?
debugging
scala
interpreter
Lars Yencken
fuente
fuente

Respuestas:
Sí, puede hacerlo en Scala 2.8. Tenga en cuenta que, para que esto funcione, debe incluir scala-compiler.jar en su classpath. Si invoca su programa scala con
scala, se hará automáticamente (o eso parece en las pruebas que hice).Luego puede usarlo así:
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) } } }Puede pasar varios
DebugParamargumentos. Cuando aparezca el REPL, el valor de la derecha estará vinculado a un valor cuyo nombre proporcionó a la izquierda. Por ejemplo, si cambio esa línea así:breakIf(i == 5, DebugParam("j", i))Entonces la ejecución sucederá así:
C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5Continúa la ejecución escribiendo
:quit.También puede caer incondicionalmente en REPL invocando
break, que recibe unListde enDebugParamlugar de un vararg. Aquí hay un ejemplo completo, código y ejecución: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) } } }Y entonces:
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 <console>:5: error: not found: value j j ^ scala> :quit 8 9 10 C:\Users\Daniel\Documents\Scala\Programas>fuente
scala.tools.nsc.MissingRequirementError: object scala not found.en Scala 2.8. Puede que tenga que pasar explícitamente la ruta de clase del proceso de acogida a los ajustes de los scalac, perobreakybreakIfqué no hacer esto. Aquí hay una versión parcheada debreakeso: gist.github.com/290632java -classpath .... Supongo que si lo usascala -classpathen su lugar, funcionaría bien.java -classpathproceso del host a la configuración de scalac: old.nabble.com/…Para agregar a la respuesta de Daniel, a partir de Scala 2.9, los métodos
breakybreakIfestán contenidos enscala.tools.nsc.interpreter.ILoop. Además,DebugParames ahoraNamedParam.fuente
IntelliJ IDEA:
Evaluate Expression( Alt+F8 ventana , en el menú: Ejecutar -> Evaluar expresión) para ejecutar código Scala arbitrario.Eclipse:
A partir de Scala 2.10, ambos
breakybreakIfse han eliminado deILoop.Para entrar en intérprete tendrá que trabajar
ILoopdirectamente con él .Primero agregue la
scala compilerbiblioteca. Para Eclipse Scala, haga clic derecho en proyecto =>Build Path=>Add Libraries...=>Scala Compiler.Y luego puede usar lo siguiente donde desee iniciar el 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()En Eclipse Scala, el intérprete se puede utilizar desde la
Consolevista:fuente