debugging - ejemplos - Acceda al intérprete durante la ubicación arbitraria del código scala
django (3)
Para agregar a la respuesta de Daniel, a partir de Scala 2.9, los métodos break
y breakIf
están contenidos en scala.tools.nsc.interpreter.ILoop
. Además, DebugParam
ahora es NamedParam
.
Vengo de un fondo de Python, donde en cualquier punto de mi código puedo agregar
import pdb; pdb.set_trace()
y en el tiempo de ejecución seré transferido a un intérprete interactivo en ese punto. ¿Hay un equivalente para scala, o esto no es posible en tiempo de ejecución?
Sí, puedes, en Scala 2.8. Tenga en cuenta que, para que esto funcione, debe incluir scala-compiler.jar en su classpath. Si invoca su scala program con scala
, se realizará automáticamente (o al menos eso parece en las pruebas que realicé).
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 múltiples argumentos de DebugParam
. Cuando aparezca REPL, el valor de la derecha se vinculará 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 una List
de DebugParam
lugar de una 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>
IntelliJ IDEA:
- Ejecutar en modo de depuración o adjuntar un depurador remoto
- Establecer un punto de interrupción y ejecutar hasta llegar a él
- Abra la ventana
Evaluate Expression
( Alt + F8 , en menú: Ejecutar -> Evaluar expresión) para ejecutar código Scala arbitrario. - Escriba qué fragmento de código o expresión desea ejecutar y haga clic en Evaluar
- Escriba Alt + V o haga clic en Evaluar para ejecutar el fragmento de código.
Eclipse:
A partir de Scala 2.10 ambos se break
y se break
breakIf
se han eliminado de ILoop
.
Para entrar en el intérprete, tendrás que trabajar con ILoop
directamente.
Primero agregue la biblioteca del scala compiler
. Para Eclipse Scala, haga clic derecho en project => Build Path
=> Add Libraries...
=> Scala Compiler
.
Y luego puede usar lo siguiente donde quiera 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 vista de la Console
: