82 votes

Passer dans l'interprète lors de la localisation arbitraire du code scala

Je viens d'un fond Python, où je peux ajouter n'importe où dans mon code

 import pdb; pdb.set_trace()
 

et au moment de l'exécution, je vais me retrouver dans un interprète interactif à cet endroit. Existe-t-il un équivalent pour scala ou est-ce impossible lors de l'exécution?

77voto

Daniel C. Sobral Points 159554

Oui, vous pouvez, sur Scala 2.8. Notez que, pour que cela fonctionne, vous devez inclure l'scala-compiler.jar dans votre classpath. Si vous appelez votre scala programme avec scala, cela sera fait automatiquement (ou alors, il semble que dans les tests que j'ai fait).

Vous pouvez alors 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. Lors de la RÉPLICATION de revient, la valeur sur le droit d'être lié à un val dont le nom que vous avez fourni sur la gauche. Par exemple, si je change cette ligne comme ceci:

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

Ensuite, l'exécution va se passer 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 aussi inconditionnellement tomber dans REPL en invoquant break, qui reçoit un List de DebugParam au lieu d'une vararg. Voici un exemple complet, le code et l'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)
    }
  }
}

Et 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>

24voto

Kipton Barros Points 12445

Pour ajouter à la réponse de Daniel, à partir de Scala 2.9, les méthodes break et breakIf sont contenues dans scala.tools.nsc.interpreter.ILoop . De plus, DebugParam est maintenant NamedParam .

24voto

Răzvan Panda Points 6800

Comme de la Scala 2.10 les deux break et breakIf ont été retirés de ILoop.

Pour percer interprète, vous aurez à travailler avec des ILoop directement.

Premier add - scala compiler bibliothèque. Pour Eclipse Scala, clic droit sur le projet => Build Path => Add Libraries... => Scala Compiler.

Et puis vous pouvez utiliser la commande suivante 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ète peut être utilisé à partir de l' Console vue:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X