Scala коллекция элементов, доступных по имени - PullRequest
3 голосов
/ 01 августа 2011

У меня есть некоторый код 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
}

Есть ли какой-нибудь более приятный способ объявить кучу вещей и иметь возможность доступа к ним как индивидуально по имени, так и коллективно?

Проблема, с которой я столкнулся в приведенном выше коде, заключается в том, что в реальной версии есть почти 30 разных вещей, и нет никакого способа убедиться, что каждая новая вещь, которую я добавляю, также добавляется в соответствующий список (или что allThings не заканчивается с дубликатами, хотя это относительно легко исправить).

Различные вещи могут обрабатываться в совокупности практически всей кодовой базой, но есть несколько мест и несколько вещей, где индивидуальная идентификация имеет значение.

Я думал только об использовании Map, но потом компилятор теряет способность проверять, существуют ли отдельные искомые объекты (и мне приходится либо оборачивать код для обработки неудачного поиска вокруг каждой попытки, либо игнорировать проблему и эффективно рисковать исключениями нулевого указателя).

Я мог бы сделать вид, что каждая вещь принадлежит наблюдаемому свойству вещей, тогда я бы, по крайней мере, имел бы один список всех вещей и мог бы получить списки каждого из видов с фильтром, но основная проблема остается в том, что я в идеале хотелось бы иметь возможность объявить, что вещь существует, имеет имя (идентификатор) и является частью коллекции.

Что я действительно хочу, так это что-то вроде карты времени компиляции. Есть ли хороший способ добиться чего-то подобного в Scala?

1 Ответ

5 голосов
/ 01 августа 2011

Как насчет этого типа рисунка?

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
}

Вы также можете добавить немного сахара, что делает Things автоматически конвертируемым в List,

object Things {
  implicit def thingsToList[A](things: Things[A]): List[A] = things.all
}

Я не могу придумать, как это сделать без var, который имеет такой же хороший синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...