Как работать с перечислениями и типами, зависящими от пути, в Scala - PullRequest
1 голос
/ 31 января 2011

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

def makeList[E <: Enumeration](enum: E): List[enum.Value] = enum.values.toList

, но компиляция завершается с ошибкой illegal dependent method type. Можно ли написать это вместо этого?

def makeList[E <: Enumeration](enum: E): List[E#Value] = enum.values.toList

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

Вы можете использовать тип, зависящий от пути, но сейчас это экспериментальная функция.Используйте -Xexperimental для скалы или скаляка.

$ scala -Xexperimental
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def makeList[E <: Enumeration](enum: E): List[enum.Value] = enum.values.toList
makeList: [E <: Enumeration](enum: E)List[enum.Value]

scala> object Bool extends Enumeration { 
     |   type Bool = Value
     |   val True, False = Value 
     | }
defined module Bool

scala> makeList(Bool)
res0: List[Bool.Value] = List(True, False)
0 голосов
/ 31 января 2011

Мне кажется, все в порядке:

object WeekDay extends Enumeration { 
  type WeekDay = Value 
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
}

> makeList(WeekDay)
res2: List[WeekDay#Value] = List(Mon, Tue, Wed, Thu, Fri, Sat, Sun)

> makeList(WeekDay.Mon)
error: inferred type arguments [WeekDay.Value] do not conform to method makeList's type parameter bounds [E <: Enumeration]
       makeList(WeekDay.Mon)
       ^

ОБНОВЛЕНИЕ в ответ на комментарий:

Полагаю, кто-то мог бы переопределить вложенный класс Value вместо Val (я просто посмотрел на источник, и он не запечатан), но я не могу придумать причину , Обратите внимание, что обычно для всех перечислений Value имеет одинаковый тип:

object Bool extends Enumeration { 
  type Bool = Value
  val True, False = Value 
}

> Bool.True.getClass
res8: java.lang.Class[_] = class scala.Enumeration$Val
> Bool.True.getClass == WeekDay.Mon.getClass
res7: Boolean = true
...