স্বেচ্ছাসেবক স্কাল কোড অবস্থানের সময় দোভাষীর মধ্যে ফেলে দিন


85

আমি পাইথন পটভূমি থেকে এসেছি, যেখানে আমার কোডের যে কোনও সময়ে আমি যুক্ত করতে পারি

import pdb; pdb.set_trace()

এবং রানটাইমের সময় আমি সেই জায়গায় একটি ইন্টারেক্টিভ ইন্টারপ্রেটারে ফেলে দেব। স্কালার জন্য কি সমতুল্য, নাকি রানটাইম এ এটি সম্ভব নয়?


7
"বিজ্ঞাপনে সত্যের" চেতনায় স্কালার কোনও দোভাষী নেই। এর আরপিএল হ'ল "সংকলন এবং যেতে"। এটি বলেছিল, আরপিএল কোড (সংকলক সহ) আপনার আবেদনের সাথে সংযুক্ত করা যেতে পারে, যদি আপনি চান (নীচে দেখানো হয়েছে)
র্যান্ডাল শুলজ

4
আপনি স্পষ্টভাবে এবং শ্রমসাধ্যভাবে আপনার আরএপিএল-লঞ্চিং কোডটিতে যেভাবে বেঁধে রেখেছেন তা ছাড়া আরআরপিএল আপনার চলমান প্রসঙ্গের কোনও জ্ঞান ছাড়াই চালু করবে। নিচে দেখ. আমি মনে করি অজগরটিতে আপনি চলমান প্রসঙ্গে চলে যা যা আরও ভাল। যাইহোক, স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 24674288/ … আরও আধুনিক।
ম্যাটানস্টার

উত্তর:


78

হ্যাঁ, আপনি স্কেলা ২.৮ এ পারেন। মনে রাখবেন, এটি কাজ করার জন্য আপনাকে আপনার ক্লাসপথে স্কেলা-কম্পাইলারজার অন্তর্ভুক্ত করতে হবে। আপনি যদি আপনার স্কালার প্রোগ্রামটির সাথে অনুরোধ করেন তবে 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, যা একটি পায় 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>

4
এটি scala.tools.nsc.MissingRequirementError: object scala not found.স্কেলা ২.৮ এ একটি ত্রুটি হতে পারে । আপনার স্পষ্টভাবে হোস্ট প্রক্রিয়াটির ক্লাসপাথটি স্ক্যালাকের সেটিংসে প্রেরণ করতে হবে, breakএবং এবং এটি breakIfকরবেন না। এখানে breakএটির একটি প্যাচযুক্ত সংস্করণ রয়েছে : gist.github.com/290632
retronym

@retronym মজার, এটি এখানে কাজ করেছে here এটি পলপ প্রেরণ করুন। তিনি উল্লেখ করেছিলেন যে কোনওভাবেই এই জিনিসটি পরিবর্তিত হতে চলেছে।
ড্যানিয়েল সি। সোব্রাল

আমি এটি ইন্টেলিজি দ্বারা পরিচালিত একটি জুনিত পরীক্ষা থেকে চেষ্টা করেছি। ইন্টেলিজ এই প্রক্রিয়াটি চালু করে দিয়েছিল java -classpath ...। আমার ধারণা আপনি যদি এর scala -classpathপরিবর্তে ব্যবহার করেন তবে এটি ঠিকঠাক হবে।
30:48 '

4
এটি মডিউলটির নির্ভরতা ছিল এবং তাই ক্লাসপথে। ২.৮ java -classpathহোস্ট প্রক্রিয়াটির সামগ্রীগুলি স্ক্যালাকের জন্য সেটিংসে দেয় না: old.nabble.com/…
retronym


24

ড্যানিয়েলের উত্তরে যুক্ত করতে স্কেলা ২.৯ অনুসারে, পদ্ধতি breakএবং breakIfপদ্ধতিগুলি এতে অন্তর্ভুক্ত রয়েছে scala.tools.nsc.interpreter.ILoop। এছাড়াও, DebugParamএখন হয় NamedParam


নির্ভরতা হিসাবে আপনাকে জ্লাইন যোগ করতে হবে ।
schmmd

8
আপনি নতুন ব্যবহারের সাথে একটি উদাহরণ লিখতে পারেন?
উইল

24

ইন্টেলিজ আইডিএ:

  1. ডিবাগ মোডে চালান বা একটি দূরবর্তী ডিবাগার সংযুক্ত করুন
  2. একটি ব্রেকপয়েন্ট নির্ধারণ করুন এবং এটি পৌঁছানো অবধি চালান
  3. ওপেন Evaluate Expression( Alt+ + F8, মেনুতে: চালান -> মূল্যায়ন এক্সপ্রেশন) অবাধ Scala কোড চালানোর জন্য উইন্ডো।
  4. আপনি কী কোড টুকরা বা এক্সপ্রেশনটি চালাতে চান তা টাইপ করুন এবং মূল্যায়নে ক্লিক করুন
  5. টাইপ Alt+ Vবা কোড টুকরা চালানোর জন্য মূল্যায়ন ক্লিক করুন।

গ্রহন:

Scala 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ভিউ থেকে ব্যবহার করা যেতে পারে :


@ ড্যানিয়েল কেন এটি ভয়ঙ্কর?
হক্কর

14
কারণ এতে প্রচুর পরিমাণে বয়লার-প্লেট যুক্ত হয় যা প্রোগ্রামের এক পর্যায়ে ডিবাগিংয়ের লক্ষের সাথে পুরোপুরি সম্পর্কিত নয় এবং পরিবর্তে, আরপিএল পাওয়ার প্রক্রিয়া সম্পর্কিত to
ড্যানিয়েল সি

4
@ ড্যানিয়েল ২.১০ এর আরও ভাল কোন উপায় আছে?
রোটারেল

@ আরটারল উপরের সমস্যাটি কী?
ড্যানিয়েল সি সোব্রাল

@ ড্যানিয়েল আপনি লিখেছেন "এটাই ভয়াবহ। :(" কেন তা ব্যাখ্যা সহ। আমি এর সাথে একমত। তবে এর থেকে আরও ভাল উপায় কি আছে?
রটারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.