स्कैटर कोड स्थान के दौरान दुभाषिया में गिरावट


84

मैं एक पायथन पृष्ठभूमि से आता हूं, जहां मेरे कोड में किसी भी बिंदु पर मैं जोड़ सकता हूं

import pdb; pdb.set_trace()

और रनटाइम पर मुझे उस स्थान पर एक इंटरैक्टिव दुभाषिया में गिरा दिया जाएगा। क्या स्कैला के लिए एक समान है, या क्या यह रनटाइम पर संभव नहीं है?


7
"विज्ञापन में सच्चाई" की भावना में, स्काला का कोई दुभाषिया नहीं है। इसका REPL "संकलन-और-जाना" है। कहा कि, REPL कोड (संकलक सहित) को आपके आवेदन में शामिल किया जा सकता है, यदि आप चाहें (जैसा कि नीचे दिखाया गया है)
रान्डेल शुल्ज़

1
लेकिन REPL आपके चल रहे संदर्भ के किसी भी ज्ञान के बिना लॉन्च करेगा, सिवाय इसके कि आप स्पष्ट रूप से और श्रमसाध्य रूप से अपने REPL- लॉन्चिंग कोड में क्या बांधेंगे। निचे देखो। मुझे लगता है कि अजगरों में आप चल रहे संदर्भ में उतरते हैं जो बहुत बेहतर है। वैसे भी, stackoverflow.com/questions/24674288/… अधिक अद्यतित है।
Matanster

जवाबों:


78

हाँ, आप कर सकते हैं, स्काला 2.8 पर। ध्यान दें कि, इस काम के लिए, आपको अपने क्लासपाथ में scala-compiler.jar को शामिल करना होगा। यदि आप अपने स्कैला कार्यक्रम को लागू करते हैं 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, जो कि vargg Listके DebugParamबजाय प्राप्त होता है । यहाँ एक पूर्ण उदाहरण, कोड और निष्पादन है:

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>

3
इससे scala.tools.nsc.MissingRequirementError: object scala not found.स्काला 2.8 में त्रुटि हो सकती है । आप स्पष्ट रूप से Scalac की सेटिंग के लिए मेजबान की प्रक्रिया के classpath पारित करने के लिए आवश्यकता हो सकती है, लेकिन breakऔर breakIfऐसा नहीं करते हैं। यहाँ की एक समझौता संस्करण है break: कि है gist.github.com/290632
retronym

@retronym फनी, बस यहीं काम किया। इसे पल्प पर भेजें। उन्होंने इस बात का उल्लेख किया कि यह वैसे भी बदल जाएगा।
डैनियल सी। सोबरल

मैंने इसे एक JUnit परीक्षण से आज़माया, जिसे IntelliJ ने चलाया। इंटेलीज ने प्रक्रिया शुरू की java -classpath ...। मुझे लगता है कि अगर आप scala -classpathइसके बजाय उपयोग करें तो यह ठीक काम करेगा।
retronym

4
यह मॉड्यूल की एक निर्भरता थी, और इसलिए कक्षापथ में। 2.8 की सामग्री को पास नहीं java -classpath: scalac के लिए सेटिंग्स के लिए मेजबान की प्रक्रिया के old.nabble.com/...
retronym

1
@ हुर्र ने जवाब दिया रेजवान पांडा
डैनियल सी। सोबराल

24

डैनियल के जवाब में जोड़ने के लिए, स्केल 2.9 के रूप में, breakऔर breakIfविधियां निहित हैं scala.tools.nsc.interpreter.ILoop। इसके अलावा, DebugParamअब है NamedParam


आपको निर्भरता के रूप में jline जोड़ने की आवश्यकता होगी ।
schmmd

8
क्या आप नए उपयोग के साथ एक उदाहरण लिख सकते हैं?
विल

24

इंटेलीज आईडिया:

  1. डिबग मोड में चलाएं या रिमोट डिबगर संलग्न करें
  2. एक ब्रेकपॉइंट सेट करें और तब तक चलाएं जब तक आप उस तक नहीं पहुंच जाते
  3. ओपन Evaluate Expression( Alt+ F8, मेनू में: भागो -> मूल्यांकन अभिव्यक्ति) खिड़की मनमाना स्काला कोड चलाने के लिए।
  4. टाइप करें कि कौन सा कोड टुकड़ा या अभिव्यक्ति आप चलाना चाहते हैं और मूल्यांकन पर क्लिक करें
  5. टाइप करें Alt+ Vया कोड टुकड़ा चलाने के लिए मूल्यांकन पर क्लिक करें।

ग्रहण:

स्कैला के रूप में 2.10 breakऔर दोनों breakIfको हटा दिया गया है ILoop

दुभाषिया में टूटने के लिए आपको ILoopसीधे काम करना होगा ।

पहले scala compilerपुस्तकालय जोड़ें । ग्रहण स्केल के लिए, प्रोजेक्ट => 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()

ग्रहण स्केल में दुभाषिया का उपयोग Consoleदृश्य से किया जा सकता है :


18
यह खराब है। :(
डैनियल सी। सोबराल

@ डैनियल वह भयानक क्यों है?
हक्कर

14
क्योंकि यह बहुत सारे बॉयलर-प्लेट जोड़ता है जो प्रोग्राम में एक बिंदु पर डिबगिंग के लक्ष्य से पूरी तरह से संबंधित नहीं है, और इसके बजाय, आरईपीएल होने के यांत्रिकी से संबंधित है।
डैनियल सी। सोबरल

1
@ डैनियल स्कला 2.10 में कोई बेहतर तरीका है?
रोटरल

@roterl उपरोक्त समस्या क्या है?
डैनियल सी। सोबरल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.