可通过名称访问的元素的Scala集合

Ben*_*Ben 3 scala map

我有一些Scala代码大致类似于:

object Foo {
    val thingA = ...
    val thingB = ...
    val thingC = ...
    val thingD = ...
    val thingE = ...

    val thingsOfAKind = List(thingA, thingC, thingE)
    val thingsOfADifferentKind = List(thingB, thingD)
    val allThings = thingsOfAKind ::: thingsOfADifferentKind
}
Run Code Online (Sandbox Code Playgroud)

是否有一些更好的方式来声明一堆东西,并能够通过名称和集体单独访问它们?

我对上面代码的问题是真正的版本有近30种不同的东西,并且没有办法真正确保我添加的每个新东西也被添加到适当的列表中(或者allThings最终没有重复,虽然这相对容易修复).

几乎所有的代码库都可以对各种事物进行综合处理,但是有一些地方和一些事情,个人身份很重要.

我想过只使用一个Map,但是编译器失去了检查被查找的单个内容实际存在的能力(我必须包装代码来处理每次尝试失败的查找,或忽略问题并有效地冒险空指针异常).

我可以使每种东西属于事物的可观察属性,然后我至少会有一个列表中的所有东西,并且可以通过过滤器得到每种类型的列表,但核心问题仍然是我理想地喜欢能够声明一个东西存在,有一个名称(标识符),并且是一个集合的一部分.

我真正想要的是类似于编译时的Map.在Scala中有没有一种很好的方法可以实现这样的功能?

Kip*_*ros 5

这种模式怎么样?

class Things[A] {
  var all: List[A] = Nil
  def ->: (x: A): A = { all = x :: all; x }
}

object Test {
  val things1 = new Things[String]
  val things2 = new Things[String]

  val thingA = "A" ->: things1
  val thingB = "B" ->: things2
  val thingC = "C" ->: things1
  val thingD = ("D" ->: things1) ->: things2
}
Run Code Online (Sandbox Code Playgroud)

你也可以添加一点糖,Things自动转换为List,

object Things {
  implicit def thingsToList[A](things: Things[A]): List[A] = things.all
}
Run Code Online (Sandbox Code Playgroud)

如果没有var同样好的语法,我无法想到这样做的方法.