Инициализация scala BitSet из диапазона - PullRequest
11 голосов
/ 16 июня 2011

Я хотел бы инициализировать Scala BitSet, чтобы он содержал целые числа от 1 до N. Следующее будет работать, но я ищу лучшее решение:

var s = BitSet.empty ++ (1 to n)

Я надеялся, что смогу сделать что-то вроде этого:

var s:BitSet = (1 to n).toSet

... но это приводит к ошибке:

error: polymorphic expression cannot be instantiated to expected type;
  found   : [B >: Int]scala.collection.immutable.Set[B]
  required: scala.collection.immutable.BitSet

Я что-то упускаю из виду?

Ответы [ 2 ]

13 голосов
/ 16 июня 2011

Вот для чего breakOut:

val s: BitSet = (1 to n).map(identity)(breakOut)

См. этот вопрос , чтобы понять внутреннюю работу функции breakOut.

Другим решением является использование конструктораBitSet:

val s = BitSet((1 to n): _*)

: _* сообщает компилятору, что вы хотите использовать Range в качестве повторяющихся параметров.

Поскольку breakOut выглядит ужасно, вы можете использовать pimp-my-шаблон библиотеки для создания более привлекательного кода (как описано здесь ):

val s = (1 to n).to[BitSet]
3 голосов
/ 16 июня 2011

Копаясь в исходный код Scala, определение toBitSet находится в TraversibleOnce.scala:

/** Converts this $coll to a set.
 *  $willNotTerminateInf
 *  @return      a set containing all elements of this $coll.
 */
def toSet[B >: A]: immutable.Set[B] = immutable.Set() ++ self

Итак, что довольно интересно, реализация toSet в Scala просто делает ваше первое решение за сценой в случае простого Set. Если вы действительно предпочитаете второй синтаксис, который вы предложили для случая BitSet, то вы можете свернуть свой собственный с неявным преобразованием типов:

class BitSetConvertible(t: TraversableOnce[Int]) {
  def toBitSet = BitSet.empty ++ t
}

implicit def asBitSetConvertible(t: TraversableOnce[Int]) = new BitSetConvertible(t)

Теперь вы можете делать такие заявления, как:

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