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
DebugParam
argumentos. 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 = 5
Continúa la ejecución escribiendo
:quit
.También puede caer incondicionalmente en REPL invocando
break
, que recibe unList
de enDebugParam
lugar 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, perobreak
ybreakIf
qué no hacer esto. Aquí hay una versión parcheada debreak
eso: gist.github.com/290632java -classpath ...
. Supongo que si lo usascala -classpath
en su lugar, funcionaría bien.java -classpath
proceso 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
break
ybreakIf
están contenidos enscala.tools.nsc.interpreter.ILoop
. Además,DebugParam
es 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
break
ybreakIf
se han eliminado deILoop
.Para entrar en intérprete tendrá que trabajar
ILoop
directamente con él .Primero agregue la
scala compiler
biblioteca. 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
Console
vista:fuente