45 votes

Est-il un moyen facile d'obtenir la Scala REPL pour recharger une classe ou d'un paquet?

J'ai presque toujours un Scala de RÉPLICATION de session ou deux, ce qui le rend très facile de donner Java ou Scala classes d'un test rapide. Mais si je change de classe et de le recompiler, la RÉPLICATION se poursuit avec l'ancien chargé. Est-il un moyen de l'obtenir pour recharger la classe, plutôt que d'avoir à redémarrer le REPL?

Juste pour donner un exemple concret, supposons que nous avons le fichier de Test.scala:

object Test { def hello = "Hello World" }

Nous le compiler et lancer le REPL:

~/pkg/scala-2.8.0.Beta1-prerelease$ bin/scala
Welcome to Scala version 2.8.0.Beta1-prerelease
(Java HotSpot(TM) Server VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Test.hello
res0: java.lang.String = Hello World

Puis nous modifions le fichier source

object Test {
  def hello = "Hello World"
  def goodbye = "Goodbye, Cruel World"
}

mais nous ne pouvons pas l'utiliser:

scala> Test.goodbye
<console>:5: error: value goodbye is not a member of object Test
       Test.goodbye
            ^

scala> import Test;
<console>:1: error: '.' expected but ';' found.
       import Test;

41voto

Rex Kerr Points 94401

Il existe une alternative pour le rechargement de la classe, si le but est de ne pas avoir à répéter les commandes précédentes. Le REPL a la commande

:replay

qui redémarre à la RÉPLICATION de l'environnement et de lire toutes les précédentes commandes valides. (Les invalides sont ignorés, donc si c'était mal avant, il ne sera pas soudainement de travail.) Lorsque la RÉPLICATION est remis à zéro, il ne recharger les classes, de sorte que de nouvelles commandes peut utiliser le contenu de la recompilation de classes (en fait, les anciennes commandes aussi utiliser ces recompilé classes).

Ce n'est pas une solution, mais c'est un raccourci est utile de prolonger une séance individuelle avec le re-calcul de l'état.

30voto

Daniel Spiewak Points 30706

Classe de rechargement n'est pas un problème facile. En fait, c'est quelque chose que la JVM rend très difficile. Vous avez quelques options si:

  • Début de la Scala de RÉPLICATION en mode de débogage. La JVM débogueur a quelques intégré de rechargement qui fonctionne au niveau de la méthode. Il ne sera pas vous aider avec le cas que vous avez donné, mais il serait en mesure de gérer quelque chose de simple comme la modification d'une méthode de mise en œuvre.
  • Utilisation de votre produit (http://www.zeroturnaround.com/jrebel). JRebel est en fait un super-chargée de la classe de rechargement solution pour l' JVM. Il peut gérer membre de l'ajout et de la suppression, nouveaux ou supprimé les classes, de la définition des changements, etc. Juste au sujet de la seule chose qu'il ne peut pas gérer des changements dans la hiérarchie de classe (l'ajout d'un super-interface, pour exemple). Ce n'est pas un outil gratuit, mais ils offrent un complément de licence, qui est limitée à la Scala unités de compilation.

Malheureusement, ces deux sont limitées par la Scala REPL de détails de mise en œuvre. J'utilise votre produit, et il fait généralement l'affaire, mais il ya encore des cas où le REPL ne reflète pas la reloaded classe(s). Pourtant, c'est mieux que rien.

8voto

jiahut Points 21

Il y a une commande de vous rencontrer exigence

:load path/to/file.scala

afin de recharger la scala fichier source et recompiler pour les classes , vous pouvez relire votre code

6voto

cevaris Points 1145

Cela fonctionne pour moi....

Si votre nouveau fichier source Test.scala ressemble à quelque chose comme ça...

package com.tests

object Test {
  def hello = "Hello World"
  def goodbye = "Goodbye, Cruel World"
}

Vous devez d'abord charger les nouveaux changements dans Scala console (REPL).

:load src/main/scala/com/tests/examples/Test.scala

Puis re-importer le paquet de sorte que vous pouvez faire référence au nouveau code de la Scala de la console.

import com.tests.Test

Profitez de votre nouveau code, sans avoir à redémarrer votre session :)

scala> Test.goodbye
res0: String = Goodbye, Cruel World

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X