8

次の列挙を持つ

object ResponseType extends Enumeration {
  val Listing, Album = Value
}

その値のリストを取得するにはどうすればよいですか?

4

3 に答える 3

16

これについて徹底したい場合は、シンボルにValueスーパータイプがあることを確認する必要があります。

def valueSymbols[E <: Enumeration: TypeTag] = {
  val valueType = typeOf[E#Value]
  typeOf[E].members.filter(sym => !sym.isMethod &&
    sym.typeSignature.baseType(valueType.typeSymbol) =:= valueType
  )
}

たとえあなたが以下を持っていたとしても(これは完全に合法です):

object ResponseType extends Enumeration {
  val Listing, Album = Value
  val someNonValueThing = "You don't want this in your list of value symbols!"
}

それでも正しい答えが得られます:

scala> valueSymbols[ResponseType.type] foreach println
value Album
value Listing

現在のアプローチにはvalue someNonValueThingここが含まれます。

于 2012-08-26T20:58:51.967 に答える
7

次のコードはSymbol、「vals」を表すオブジェクトのリストを取得します。

import reflect.runtime.universe._ // Access the reflection api

typeOf[ResponseType.Value]  //  - A `Type`, the basic unit of reflection api
  .asInstanceOf[TypeRef]    //  - A specific kind of Type with knowledge of
                            //    the place it's being referred from
  .pre                      //  - AFAIK the referring Type
  .members                  //  - A list of `Symbol` objects representing
                            //    all members of this type, including 
                            //    private and inherited ones, classes and 
                            //    objects - everything.
                            //    `Symbol`s are the second basic unit of 
                            //    reflection api.
  .view                     //  - For lazy filtering
  .filter(_.isTerm)         //  - Leave only the symbols which extend the  
                            //    `TermSymbol` type. This is a very broad 
                            //    category of symbols, which besides values
                            //    includes methods, classes and even 
                            //    packages.
  .filterNot(_.isMethod)    //  - filter out the rest
  .filterNot(_.isModule)
  .filterNot(_.isClass)
  .toList                   //  - force the view into a final List

.collectis 句でフィルタリングする代わりに、次のように特定のタイプのテストを実装できることに注意してください。

.collect{ case symbol : MethodSymbol => symbol }

このアプローチは、リフレクション API の他のタスクで必要になる場合があります。

また、 a の使用.viewはまったく必須ではなく、入力コレクションを 1 回だけトラバースすることで、一連のアプリケーション ( などのfilter他の多くの関数と同じくらい) の使用をより効果的にするだけであることに注意してください。実際に具体的なコレクションに強制されているポイント(この場合)。mapflatMap.toList

アップデート

ResponseTypeTravis Brown が提案したように、オブジェクトを直接参照することも可能です。そのため、typeOf[ResponseType.Value].asInstanceOf[TypeRef].pre部品を交換することができます typeOf[ResponseType.type]

于 2012-08-26T09:54:48.240 に答える
3

列挙型のvaluesメソッドによって返されるセットを介して、列挙型の値を反復処理できます。

scala> for (e <- ResponseType.values) println(e)
Listing
Album
于 2012-08-26T10:12:06.037 に答える