web-dev-qa-db-fra.com

Baisse dans l'interpréteur pendant arbitraire scala Emplacement du code

Je viens d'un Python arrière-plan, où à tout moment de 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?

83
Lars Yencken

Oui, vous pouvez, sur Scala 2,8. Notez que, pour que cela fonctionne, vous devez inclure le Scala-compiler.jar dans votre classe de classe. Si vous appelez votre scala Programme avec scala, il sera fait automatiquement (ou il semble donc dans les tests que j'ai faits).

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 produira comme suit:

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 déposer sans condition dans REPL en invoquant break, qui reçoit un List de DebugParam au lieu d'un exemple de vararg. Voici un exemple complet. Voici un exemple complet. Voici un exemple complet. 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>
77
Daniel C. Sobral

Idée Intellij :

  1. Exécuter en mode de débogage ou attacher un débogueur distant
  2. Définissez un point d'arrêt et courez jusqu'à ce que vous atteigniez.
  3. Ouvert Evaluate Expression (Alt+F8, dans le menu: exécuter -> Evaluez l'expression) Fenêtre pour exécuter arbitraire Scala code.
  4. Tapez quel fragment ou expression de code que vous souhaitez exécuter et cliquez sur Évaluer
  5. Taper Alt+V ou cliquez sur Évaluer pour exécuter le fragment de code.

Eclipse :

À partir de Scala 2.10 break et breakIf ont été supprimés de ILoop.

Pour briser l'interprète, vous devrez travailler avec ILoop directement.

D'abord ajouter scala compiler une bibliothèque. Pour Eclipse Scala, clic droit sur Project => Build Path => Add Libraries... => Scala Compiler.

Et vous pouvez ensuite utiliser ce qui suit où vous souhaitez démarrer l'interprète:

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 la vue Console:

24

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. En outre, DebugParam est maintenant NamedParam.

24
Kipton Barros