如何向Scala枚举对象添加方法?

如何向Scala枚举对象添加方法?,scala,enumeration,Scala,Enumeration,我正在使用Scala 2.8并定义如下枚举: object Stooges extends Enumeration { type Stooge = Value val Larry, Curly, Moe = Value } import Stooges._ object App extends Application { println(Stooges.nextStooge(Larry)) } 我想给这个枚举添加一个循环到“下一个”stooge的方法。我可以在Stooges之外定

我正在使用Scala 2.8并定义如下枚举:

object Stooges extends Enumeration {
  type Stooge = Value
  val Larry, Curly, Moe = Value
}
import Stooges._
object App extends Application {
  println(Stooges.nextStooge(Larry))
}
我想给这个枚举添加一个循环到“下一个”stooge的方法。我可以在Stooges之外定义这样一种方法,这种方法在测试程序中工作得很好:

def nextStooge(v:Stooges.Stooge):Stooges.Stooge =
  Stooges((v.id+1) % Stooges.values.size)
我真正想要的是将这个方法添加到Stooges中,我已经尝试过这样做(同时使用Stooges.Stooge和Stooges.Value)。它们都是编译的。但是运行这样的程序:

object Stooges extends Enumeration {
  type Stooge = Value
  val Larry, Curly, Moe = Value
}
import Stooges._
object App extends Application {
  println(Stooges.nextStooge(Larry))
}
收益率:

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)
线程“main”java.lang.ExceptionInInitializeError中的异常 在demo.App.main(Stooges.scala)上 原因:java.lang.IllegalArgumentException:参数数目错误 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:592) 在scala.Enumeration$$anonfun$scala$Enumeration$$nameOf$2.apply处(Enumeration.scala:176) 在scala.Enumeration$$anonfun$scala$Enumeration$$nameOf$2.apply处(Enumeration.scala:171) 在scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply处(TraversableLike.scala:1200) 位于scala.collection.IndexedSeqLike$class.foreach(IndexedSeqLike.scala:85) 位于scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:20) 位于scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:1199) 位于scala.Enumeration.scala$Enumeration$$nameOf(Enumeration.scala:171) 在scala.Enumeration$Val.toString处(Enumeration.scala:237) 位于java.lang.String.valueOf(String.java:2615) 在java.io.PrintStream.print(PrintStream.java:616) 在java.io.PrintStream.println(PrintStream.java:753) 在scala.Console$.println处(Console.scala:198) 在scala.Predef$.println处(Predef.scala:152) 在demo.App$(Stooges.scala:14) 位于demo.App$(Stooges.scala) 这是一个错误还是一个坏主意?

这对我很有用:

scala> object Stooges extends Enumeration {
     |   type Stooge = Value
     |   val Larry = Value("Larry")
     |   val Curly = Value("Curly")
     |   val Moe = Value("Moe")
     |
     |   def nextStooge(v:Stooges.Stooge) = Stooges((v.id+1) % Stooges.maxId)
     | }
defined module Stooges

scala>

scala> import Stooges._
import Stooges._

scala> nextStooge(Larry)
res0: Stooges.Value = Curly

scala> nextStooge(Curly)
res1: Stooges.Value = Moe

scala> nextStooge(Moe)
res2: Stooges.Value = Larry

如果能说
Larry.nextStooge
而不是
nextStooge(Larry)
,那肯定会更好。我想你必须用一个自定义的密封类来实现它。

这是一个bug。这种初始化正在做一些非常奇怪的事情。如果不存在,我将打开一个ticket(完成)。

事实上,我最初的目标是不需要将arg传递给nextStooge(并且只调用next())。有趣的是,当分别指定每个val并对其命名时,这会起作用。“我会再演奏一些。”亚历克斯米勒,展示了如何做到这一点。