ฉันมาจากพื้นหลัง Python ซึ่งเมื่อใดก็ได้ในโค้ดของฉันฉันสามารถเพิ่มได้
import pdb; pdb.set_trace()
และเมื่อรันไทม์ฉันจะถูกส่งไปเป็นล่ามแบบโต้ตอบที่จุดนั้น มีสกาลาเทียบเท่าหรือไม่ในรันไทม์?
ฉันมาจากพื้นหลัง Python ซึ่งเมื่อใดก็ได้ในโค้ดของฉันฉันสามารถเพิ่มได้
import pdb; pdb.set_trace()
และเมื่อรันไทม์ฉันจะถูกส่งไปเป็นล่ามแบบโต้ตอบที่จุดนั้น มีสกาลาเทียบเท่าหรือไม่ในรันไทม์?
คำตอบ:
ใช่คุณทำได้บน Scala 2.8 โปรดทราบว่าเพื่อให้ได้ผลคุณต้องรวม scala-compiler.jar ใน classpath ของคุณ หากคุณเรียกใช้โปรแกรมสกาล่าด้วยโปรแกรม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
คุณยังคงดำเนินการโดยการพิมพ์
นอกจากนี้คุณยังสามารถลดลงใน REPL โดยไม่มีเงื่อนไขได้โดยการเรียกใช้break
ซึ่งได้รับ a 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 คุณอาจต้องชัดเจนผ่าน classpath ของกระบวนการโฮสต์การตั้งค่าของ Scalac แต่break
และbreakIf
ไม่ทำเช่นนี้ นี่คือเวอร์ชันที่ได้รับการแก้ไขแล้วbreak
: gist.github.com/290632
java -classpath ...
. ฉันเดาว่าถ้าคุณใช้scala -classpath
แทนมันจะใช้ได้ดี
java -classpath
กระบวนการโฮสต์ไปยังการตั้งค่าสำหรับ scalac: old.nabble.com/…
เพื่อเพิ่มคำตอบของ Daniel ณ Scala 2.9 break
และbreakIf
วิธีการมีอยู่ในscala.tools.nsc.interpreter.ILoop
. นอกจากนี้ยังมีอยู่ในขณะนี้DebugParam
NamedParam
IntelliJ IDEA:
Evaluate Expression
( Alt+ F8ในเมนู: เรียกใช้ -> ประเมินนิพจน์) เพื่อเรียกใช้รหัสสกาล่าโดยพลการคราส:
ณ Scala 2.10 ทั้งสองbreak
และbreakIf
ถูกลบออกจาก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
มุมมอง: