代码之家  ›  专栏  ›  技术社区  ›  Alex Miller

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

  •  3
  • Alex Miller  · 技术社区  · 15 年前

    我使用scala 2.8并定义如下枚举:

    object Stooges extends Enumeration {
      type Stooge = Value
      val Larry, Curly, Moe = Value
    }
    

    我想在这个枚举中添加一个循环到“下一个”分支的方法。我可以在凳子外定义这样一种方法,这在测试程序中非常有效:

    def nextStooge(v:Stooges.Stooge):Stooges.Stooge =
      Stooges((v.id+1) % Stooges.values.size)
    

    我真正想要的是将这个方法添加到凳子中,并且我尝试过这样做(同时使用凳子、凳子和凳子.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)
    

    这是个错误还是个坏主意?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Jung    15 年前

    这对我很有用:

    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) . 我想您必须用一个定制的密封类来实现它。

        2
  •  2
  •   Daniel C. Sobral    15 年前

    这是一个错误。这种初始化正在做一些非常奇怪的事情。我要开一张票(完成, #2827 ,如果不存在。