Pochodzę z języka Python, gdzie w dowolnym miejscu mogę dodać kod
import pdb; pdb.set_trace()
aw czasie wykonywania zostanę wpuszczony do interaktywnego tłumacza w tym miejscu. Czy istnieje odpowiednik dla scala, czy nie jest to możliwe w czasie wykonywania?
debugging
scala
interpreter
Lars Yencken
źródło
źródło
Odpowiedzi:
Tak, możesz na Scali 2.8. Zauważ, że aby to zadziałało, musisz dołączyć plik scala-compiler.jar do swojej ścieżki klas. Jeśli wywołasz swój program scala za pomocą
scala
, zostanie to zrobione automatycznie (a przynajmniej tak się wydaje w testach, które przeprowadziłem).Następnie możesz go użyć w następujący sposób:
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) } } }
Możesz przekazać wiele
DebugParam
argumentów. Kiedy pojawi się REPL, wartość po prawej stronie zostanie powiązana z wartością, której nazwę podałeś po lewej stronie. Na przykład, jeśli zmienię tę linię w ten sposób:breakIf(i == 5, DebugParam("j", i))
Wtedy wykonanie nastąpi tak:
C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger 0 1 2 3 4 j: Int scala> j res0: Int = 5
Kontynuujesz wykonanie, wpisując
:quit
.Możesz także bezwarunkowo przejść do REPL przez wywołanie
break
, które otrzymujeList
ofDebugParam
zamiast vararg. Oto pełny przykład, kod i wykonanie: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) } } }
I wtedy:
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>
źródło
scala.tools.nsc.MissingRequirementError: object scala not found.
w Scali 2.8. Być może trzeba wyraźnie zdać ścieżkę klas procesu hosta z ustawieniami Scalac, alebreak
ibreakIf
nie rób tego. Oto poprawiona wersjabreak
tego rozwiązania: gist.github.com/290632java -classpath ...
. Myślę, że jeśli użyjeszscala -classpath
zamiast tego, będzie dobrze.java -classpath
procesu hosta do ustawień dla skalaca: old.nabble.com/…Aby dodać do odpowiedzi Daniela, od Scala 2.9, plik
break
breakIf
metody i są zawarte wscala.tools.nsc.interpreter.ILoop
.DebugParam
Teraz też jestNamedParam
.źródło
IntelliJ IDEA:
Evaluate Expression
( Alt+F8 , w menu: Uruchom -> Oceń wyrażenie), aby uruchomić dowolny kod Scala.Zaćmienie:
Począwszy od Scala 2.10, zarówno
break
ibreakIf
zostały usunięte zILoop
.Aby włamać się do tłumacza, będziesz musiał pracować
ILoop
bezpośrednio.Najpierw dodaj
scala compiler
bibliotekę. W przypadku Eclipse Scala kliknij prawym przyciskiem myszy projekt =>Build Path
=>Add Libraries...
=>Scala Compiler
.A następnie możesz użyć następujących, w których chcesz uruchomić tłumacza:
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()
W Eclipse Scala z interpretera można skorzystać z
Console
widoku:źródło