İsteğe bağlı ölçekleme kodu konumu sırasında yorumlayıcıya bırakın


85

Kodumun herhangi bir noktasında ekleyebileceğim bir Python arka planından geliyorum

import pdb; pdb.set_trace()

ve çalışma zamanında o noktada etkileşimli bir tercümana bırakılacağım. Scala için bir eşdeğer var mı, yoksa çalışma zamanında bu mümkün değil mi?


7
"Reklamda gerçek" ruhu çerçevesinde Scala'nın tercümanı yoktur. REPL "derle ve devam et" dir. Bununla birlikte, REPL kodu (derleyici dahil) isterseniz uygulamanıza dahil edilebilir (aşağıda gösterildiği gibi)
Randall Schulz

1
Ancak REPL başlatma kodunuzda açıkça ve zahmetli bir şekilde bağladığınız şey dışında, REPL, çalışan bağlamınız hakkında herhangi bir bilgi olmadan başlayacaktır. Aşağıya bakınız. Python'da çok daha iyi olan koşu bağlamına giriyorsunuz. neyse, stackoverflow.com/questions/24674288/… daha günceldir.
matanster

Yanıtlar:


78

Evet, Scala 2.8'de yapabilirsiniz. Bunun çalışması için, sınıf yolunuza scala-compiler.jar dosyasını eklemeniz gerektiğini unutmayın. Scala programınızı ile çalıştırırsanız scala, otomatik olarak yapılacaktır (veya yaptığım testlerde öyle görünüyor).

Daha sonra bunu şu şekilde kullanabilirsiniz:

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)
    }
  }
}

Birden fazla DebugParamargüman iletebilirsiniz . REPL ortaya çıktığında, sağdaki değer, adını solda verdiğiniz değere bağlı olacaktır. Örneğin, şu satırı şu şekilde değiştirirsem:

      breakIf(i == 5, DebugParam("j", i))

Daha sonra infaz şu şekilde gerçekleşecek:

C:\Users\Daniel\Documents\Scala\Programas>scala TestDebugger
0
1
2
3
4
j: Int

scala> j
res0: Int = 5

Yazarak yürütmeye devam edersiniz :quit.

Ayrıca koşulsuz çağırarak Repl içine düşebilir breakbir aldığında, Listiçinde DebugParamyerine vararg ait. İşte tam bir örnek, kod ve yürütme:

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)
    }
  }
}

Ve sonra:

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
Bu, scala.tools.nsc.MissingRequirementError: object scala not found.Scala 2.8'de bir hataya neden olabilir . Açıkça scalać ait Ayarlar konak sürecinin sınıf yolunu geçmesi gerekebilir, ancak breakve breakIfbunu yapma. İşte yamanmış versiyonu breakolduğunu vermez: gist.github.com/290632
retronym

@retronym Komik, burada çalıştı. Paulp'a gönder. Bu şeyin zaten değişeceğinden bahsetmişti.
Daniel C. Sobral

IntelliJ tarafından yürütülen bir JUnit testinden denedim. IntelliJ süreci ile başlattı java -classpath .... Sanırım scala -classpathbunun yerine kullanırsanız iyi çalışır.
retronym

4
Modülün ve dolayısıyla sınıf yolunda bir bağımlılıktı. 2.8 içeriğini geçmez java -classpathscalać ayarlarına konak sürecinin: old.nabble.com/...
retronym

1
@Huur Bkz cevap tarafından Răzvan Panda .
Daniel C. Sobral


24

IntelliJ FİKİR:

  1. Hata ayıklama modunda çalıştırın veya uzaktan hata ayıklayıcı ekleyin
  2. Bir kesme noktası belirleyin ve ona ulaşana kadar çalıştırın
  3. Açık Evaluate Expression( Alt+ F8: - keyfi Scala kod çalıştırmasına pencere menüsündeki Çalıştır> İfade değerlendirin).
  4. Çalıştırmak istediğiniz kod parçasını veya ifadesini yazın ve Değerlendir'e tıklayın
  5. Tür Alt+ Vveya kod parçası çalıştırmak için Değerlendirmek tıklayın.

Tutulma:

Scala 2.10 itibarıyla hem breakve breakIfkaldırılmıştır ILoop.

Tercümana girmek için ILoopdoğrudan çalışmanız gerekecek .

Önce scala compilerkitaplık ekleyin . Eclipse Scala için proje => Build Path=> Add Libraries...=> üzerine sağ tıklayın Scala Compiler.

Ve sonra tercümanı başlatmak istediğiniz yerde aşağıdakileri kullanabilirsiniz:

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'da yorumlayıcı Consolegörünümden kullanılabilir :


@Daniel Neden bu kadar korkunç?
Hakkar

14
Çünkü programın bir noktasında hata ayıklama hedefiyle tamamen ilgisiz olan ve bunun yerine REPL'yi çalıştırmanın mekaniği ile ilgili olan çok sayıda kazan plakası ekler.
Daniel C. Sobral

1
@Daniel Scala 2.10'da daha iyi bir yol var mı?
roterl

@roterl Yukarıdaki sorun nedir?
Daniel C. Sobral

@Daniel "Bu korkunç. :(" nedenini açıklayarak yazdın. Buna katılıyorum. Ama daha iyi bir yol var mı?
roterl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.