web-dev-qa-db-ja.com

任意のscalaコードの場所でインタープリターにドロップする

私はPython=バックグラウンドから来ており、コードの任意の時点で追加できます

import pdb; pdb.set_trace()

実行時には、その場所で対話型インタープリターにドロップされます。 scalaに相当するものはありますか、または実行時にこれは不可能ですか?

83
Lars Yencken

はい、できます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と入力して実行を続けます。

breakを呼び出すことで、無条件にREPLにドロップすることもできます。これは、varargではなくListDebugParamを受け取ります。完全な例を以下に示します。 、コード、実行:

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

IntelliJ IDEA:

  1. デバッグモードで実行するか、リモートデバッガーを接続します
  2. ブレークポイントを設定し、到達するまで実行する
  3. Evaluate ExpressionAlt+F8、メニュー:実行->式の評価)ウィンドウで、任意のScalaコードを実行します。
  4. 実行するコードフラグメントまたは式を入力し、[評価]をクリックします
  5. タイプ Alt+V または、[評価]をクリックしてコードフラグメントを実行します。

Eclipse:

Scala 2.10以降、breakbreakIfの両方がILoopから削除されました。

インタープリターに侵入するには、ILoopを直接操作する必要があります。

最初にscala compilerライブラリを追加します。 Eclipse Scalaの場合、プロジェクトを右クリックします=> 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ビューから使用できます:

24

ダニエルの回答に追加するには、Scala 2.9以降、breakおよびbreakIfメソッドがscala.tools.nsc.interpreter.ILoopに含まれています。また、DebugParamNamedParamになりました。

24
Kipton Barros