J'utilise Scala 2.8 et la définition d'un Enumeration comme celui-ci:Comment ajouter une méthode à un objet Scala Enumeration?
object Stooges extends Enumeration {
type Stooge = Value
val Larry, Curly, Moe = Value
}
Et je veux ajouter une méthode à cette énumération que les cycles à la « prochaine » larbin. Je peux définir une telle méthode en dehors des Stooges et cela fonctionne dans un programme d'essais très bien:
def nextStooge(v:Stooges.Stooge):Stooges.Stooge =
Stooges((v.id+1) % Stooges.values.size)
Ce que je voudrais vraiment est d'ajouter cette méthode pour Stooges et je l'ai essayé de faire une telle chose (en utilisant les deux Stooges .Stooge et Stooges.Value). Ces deux compilent. Mais l'exécution d'un programme comme celui-ci:
import Stooges._
object App extends Application {
println(Stooges.nextStooge(Larry))
}
rendements:
Exception in thread "main" java.lang.ExceptionInInitializerError
at demo.App.main(Stooges.scala)
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at scala.Enumeration$$anonfun$scala$Enumeration$$nameOf$2.apply(Enumeration.scala:176)
at scala.Enumeration$$anonfun$scala$Enumeration$$nameOf$2.apply(Enumeration.scala:171)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:1200)
at scala.collection.IndexedSeqLike$class.foreach(IndexedSeqLike.scala:85)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:20)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:1199)
at scala.Enumeration.scala$Enumeration$$nameOf(Enumeration.scala:171)
at scala.Enumeration$Val.toString(Enumeration.scala:237)
at java.lang.String.valueOf(String.java:2615)
at java.io.PrintStream.print(PrintStream.java:616)
at java.io.PrintStream.println(PrintStream.java:753)
at scala.Console$.println(Console.scala:198)
at scala.Predef$.println(Predef.scala:152)
at demo.App$.<init>(Stooges.scala:14)
at demo.App$.<clinit>(Stooges.scala)
Est-ce un bug ou tout simplement une mauvaise idée?
En effet, ne pas avoir besoin de passer l'argument à nextStooge (et de l'appeler next()) était mon objectif initial. Intéressant que cela fonctionne en spécifiant chaque val séparément et en le nommant. Je vais jouer un peu plus. –
@AlexMiller, http://stackoverflow.com/questions/4346580/how-to-add-a-method-to-enumeration-in-scala montre comment cela peut être fait. –