次の列挙を持つ
object ResponseType extends Enumeration {
val Listing, Album = Value
}
その値のリストを取得するにはどうすればよいですか?
次の列挙を持つ
object ResponseType extends Enumeration {
val Listing, Album = Value
}
その値のリストを取得するにはどうすればよいですか?
これについて徹底したい場合は、シンボルに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
ここが含まれます。
次のコードは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
.collect
is 句でフィルタリングする代わりに、次のように特定のタイプのテストを実装できることに注意してください。
.collect{ case symbol : MethodSymbol => symbol }
このアプローチは、リフレクション API の他のタスクで必要になる場合があります。
また、 a の使用.view
はまったく必須ではなく、入力コレクションを 1 回だけトラバースすることで、一連のアプリケーション ( などのfilter
他の多くの関数と同じくらい) の使用をより効果的にするだけであることに注意してください。実際に具体的なコレクションに強制されているポイント(この場合)。map
flatMap
.toList
ResponseType
Travis Brown が提案したように、オブジェクトを直接参照することも可能です。そのため、typeOf[ResponseType.Value].asInstanceOf[TypeRef].pre
部品を交換することができます typeOf[ResponseType.type]
列挙型のvaluesメソッドによって返されるセットを介して、列挙型の値を反復処理できます。
scala> for (e <- ResponseType.values) println(e)
Listing
Album