编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

极客时间

如何向Scala枚举对象添加方法?:How to add a method to a Scala Enumeration object?

NihanthReddyCA Java 2022-5-11 10:24 6人围观

腾讯云服务器
如何向Scala枚举对象添加方法?的处理方法

我正在使用Scala 2.8并定义这样的枚举:

I'm using Scala 2.8 and defining an Enumeration like this:

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

我想向此枚举添加一个方法,该方法循环到下一个"隐藏对象.我可以在Stooges之外定义这种方法,并且可以在测试程序中正常工作:

And I want to add a method to this Enumeration that cycles to the "next" stooge. I can define such a method outside Stooges and this works in a test program just fine:

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

我真正想要的是将这种方法添加到Stooges中,而我尝试做这种事情(同时使用Stooges.Stooge和Stooges.Value).那些都编译.但是运行这样的程序:

What I'd really like is to add this method to Stooges and I have tried doing such a thing (using both Stooges.Stooge and Stooges.Value). Those both compile. But running a program like this:

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) 

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

Is this a bug or just a bad idea?

问题解答

这对我有用:

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),在定义上会更好.我想您必须使用一个自定义的密封类来实现它.

It would be definetively nicer to be able to say Larry.nextStooge instead of nextStooge(Larry). I suppose you have to implement that with a custom sealed class.

这篇关于如何向Scala枚举对象添加方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程技术网(www.editcode.net)!

腾讯云服务器 阿里云服务器
关注微信
^