Я походжу з фону Python, де в будь-який момент мого коду я можу додати
import pdb; pdb.set_trace()
і під час роботи мене в цьому місці помістять до інтерактивного перекладача. Чи існує еквівалент для Scala, або це неможливо під час виконання?
Я походжу з фону Python, де в будь-який момент мого коду я можу додати
import pdb; pdb.set_trace()
і під час роботи мене в цьому місці помістять до інтерактивного перекладача. Чи існує еквівалент для Scala, або це неможливо під час виконання?
Відповіді:
Так, можна, на Scala 2.8. Зауважте, що для того, щоб це працювало, вам слід включити scala-compiler.jar у шлях до вашого класу. Якщо ви запустите програму scala за допомогою scala
, це буде зроблено автоматично (або так здається в тестах, які я зробив).
Потім ви можете використовувати його так:
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)
}
}
}
Ви можете передавати кілька DebugParam
аргументів. Коли REPL з’явиться, значення праворуч буде пов’язане з валом, ім’я якого ви вказали зліва. Наприклад, якщо я зміню цей рядок так:
breakIf(i == 5, DebugParam("j", i))
Тоді виконання відбуватиметься так:
C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger
0
1
2
3
4
j: Int
scala> j
res0: Int = 5
Ви продовжуєте виконання, набравши текст :quit
.
Ви також можете беззастережно впасти в реплєї Викликаючи break
, який отримує List
з DebugParam
замість vararg. Ось повний приклад, код та виконання:
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)
}
}
}
І потім:
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>
scala.tools.nsc.MissingRequirementError: object scala not found.
в Scala 2.8. Можливо , вам буде потрібно явно передати шлях до класів хост - процесу в Настройках Scalac, але break
і breakIf
не робити цього. Ось виправлена версія break
цього: gist.github.com/290632
java -classpath ...
. Я думаю, якщо ви використовуєте scala -classpath
замість цього, це буде працювати нормально.
java -classpath
хост-процесу до налаштувань Scalac: old.nabble.com/…
Щоб додати відповідь Даніеля, станом на Scala 2.9, методи break
and breakIf
містяться в scala.tools.nsc.interpreter.ILoop
. Також DebugParam
зараз NamedParam
.
IntelliJ IDEA:
Evaluate Expression
( Alt+F8 вікно , у меню: Виконати -> Оцінити вираз), щоб запустити довільний код Scala.Затьмарення:
Станом на Scala 2.10 обидва break
і breakIf
були вилучені з ILoop
.
Щоб уникнути перекладача, вам доведеться працювати ILoop
безпосередньо.
Спочатку додайте scala compiler
бібліотеку. Для Eclipse Scala клацніть правою кнопкою миші на project =>Build Path
=> Add Libraries...
=> Scala Compiler
.
І тоді ви можете використовувати наступне, де ви хочете запустити інтерпретатор:
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()
У Eclipse Scala інтерпретатор можна використовувати з Console
подання: