Je viens d'un fond Python, où à tout moment dans mon code je peux ajouter
import pdb; pdb.set_trace()
et au moment de l'exécution, je serai déposé dans un interprète interactif à cet endroit. Existe-t-il un équivalent pour scala, ou n'est-ce pas possible au moment de l'exécution?
debugging
scala
interpreter
Lars Yencken
la source
la source
Réponses:
Oui, vous pouvez, sur Scala 2.8. Notez que, pour que cela fonctionne, vous devez inclure le scala-compiler.jar dans votre chemin de classe. Si vous invoquez votre programme scala avec
scala
, cela se fera automatiquement (du moins il semble dans les tests que j'ai effectués).Vous pouvez ensuite l'utiliser comme ceci:
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) } } }
Vous pouvez passer plusieurs
DebugParam
arguments. Lorsque le REPL apparaît, la valeur à droite sera liée à un val dont vous avez fourni le nom à gauche. Par exemple, si je change cette ligne comme ceci:breakIf(i == 5, DebugParam("j", i))
Ensuite, l'exécution se déroulera comme ceci:
C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5
Vous continuez l'exécution en tapant
:quit
.Vous pouvez également passer inconditionnellement dans REPL en invoquant
break
, qui reçoit unList
ofDebugParam
au lieu d'un vararg. Voici un exemple complet, code et exécution: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) } } }
Puis:
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>
la source
scala.tools.nsc.MissingRequirementError: object scala not found.
dans Scala 2.8. Vous devrez peut - être passer explicitement le classpath du processus hôte aux paramètres de Scalac, maisbreak
etbreakIf
ne pas le faire. Voici une version corrigée debreak
cela: gist.github.com/290632java -classpath ...
. Je suppose que si vous utilisez à lascala -classpath
place, cela fonctionnerait bien.java -classpath
processus hôte aux paramètres de scalac: old.nabble.comPour ajouter à la réponse de Daniel, à partir de Scala 2.9, les méthodes
break
etbreakIf
sont contenues dansscala.tools.nsc.interpreter.ILoop
. Aussi,DebugParam
est maintenantNamedParam
.la source
IntelliJ IDEA:
Evaluate Expression
( Alt+ F8, dans le menu: Exécuter -> Evaluer l'expression) pour exécuter du code Scala arbitraire.Éclipse:
Depuis Scala 2.10, les deux
break
etbreakIf
ont été supprimés deILoop
.Pour entrer par effraction, vous devrez travailler
ILoop
directement avec .Ajoutez d'abord une
scala compiler
bibliothèque. Pour Eclipse Scala, faites un clic droit sur project =>Build Path
=>Add Libraries...
=>Scala Compiler
.Et puis vous pouvez utiliser ce qui suit où vous souhaitez démarrer l'interpréteur:
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()
Dans Eclipse Scala, l'interpréteur peut être utilisé depuis la
Console
vue:la source