1. ホーム
  2. debugging

[解決済み] scala のコードを任意の場所に配置した状態でインタプリタにドロップする。

2023-04-30 12:24:41

質問

私は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が立ち上がると、右側の値が左側で指定した名前のvalに束縛されます。例えば、その行をこんな風に変えてみると。

      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 .

また、無条件にREPLにドロップすることもできます。 break を呼び出すことで、無条件に ListDebugParam のように、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>