类类型作为在Scala中的地图中的键 [英] Class type as key in map in Scala
问题描述
我的游戏有
class Enemy
谁是AI /功能我可以改变
trait移动
trait VerticalMover扩展移动
trait RandomMover扩展移动
等。现在我需要基于trait获取预加载的东西。我想做的是有一个地图,接受所有的traits,扩展移动作为键,然后一些EnemyContainer作为值将具有trait相关内容预加载。
但是如何我定义这样的地图,以及如何格式化我的.get()来获取容器的一些敌人的实例。像:
val myEnemy = new Enemy with RandomMover
val myDetails:EnemyContainer = enemyDetailsStore.get(myEnemy.getClass )
解决方案
Map [Class [_< ;: Moving],EnemyDetails]
类型。我怀疑像://给出一个Map [Class [_< ;: Moving],EnemyDetails]键
enemyDetailsStore.filterKeys(_ isInstance myEnemy)
或:
// Iterable [EnemyDetails]
enemyDetailsStore collect {case(c,d)if c isInstance myEnemy => d}
或者只是:
//选项[EnemyDetails]
enemyDetailsStore collectFirst {case(c,d)if c isInstance myEnemy => d}
会为你做。这个代码的唯一问题是它是O(N),因为它需要一个遍历的地图,而不是简单的查找,这将是O(1)或O(log N)
My game has
class Enemy
who's AI/functionality I can change with
trait Moving trait VerticalMover extends Moving trait RandomMover extends Moving
and so on. Now I need to fetch preloaded stuff based on trait. What I would like to do is have a Map that accepts all traits that extend Moving as keys and then some EnemyContainer as value that would have trait related content preloaded.
But how do I define such a Map and how do format my .get() to get the container by an instance of some Enemy. Something like:
val myEnemy = new Enemy with RandomMover val myDetails:EnemyContainer = enemyDetailsStore.get(myEnemy.getClass)
解决方案Well, I assume that your enemy details store is of type
Map[Class[_ <: Moving], EnemyDetails]
. I suspect that something like://gives a Map[Class[_ <: Moving], EnemyDetails] for all matching keys enemyDetailsStore.filterKeys(_ isInstance myEnemy)
Or:
//Iterable[EnemyDetails] enemyDetailsStore collect { case (c, d) if c isInstance myEnemy => d }
Or even just:
//Option[EnemyDetails] enemyDetailsStore collectFirst { case (c, d) if c isInstance myEnemy => d }
Will do for you. The only "issue" with this code is that it's O(N), in that it requires a traversal of the map, rather than a simple lookup, which would be O(1), or O(log N)
这篇关于类类型作为在Scala中的地图中的键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!