Почему мой шаблон совпадает с коллекцией в Scala? - PullRequest
3 голосов
/ 21 сентября 2011

Мой код выглядит следующим образом

  val hash = new HashMap[String, List[Any]]
  hash.put("test", List(1, true, 3))
  val result = hash.get("test")
  result match {
    case List(Int, Boolean, Int) => println("found")
    case _ => println("not found")
  }

Я ожидаю, что «найдено» будет напечатано, но «не найдено» напечатано.Я пытаюсь сопоставить любой список, который имеет три элемента типа Int, Boolean, Int

Ответы [ 3 ]

18 голосов
/ 21 сентября 2011

Вы проверяете список, содержащий сопутствующие объекты Int и Boolean .Они не совпадают с классами Int и Boolean .

Вместо этого используйте типизированный шаблон.

val result: Option[List[Any]] = ...
result match {
  case Some(List(_: Int, _: Boolean, _: Int)) => println("found")
  case _                                      => println("not found")
}

Scala Reference, раздел 8.1 описывает различные шаблоны, которые вы можете использовать.

4 голосов
/ 21 сентября 2011

Первая проблема заключается в том, что метод get возвращает Option:

scala>   val result = hash.get("test")
result: Option[List[Any]] = Some(List(1, true, 3))

Таким образом, вам нужно сопоставить с Some(List(...)), а не List(...).

Далее вы проверяете, содержит ли список объекты Int, Boolean и Int снова, а не если он содержит объекты, чьи типы равны Int , Boolean и Int снова.

Int и Boolean являются типами и объектами-компаньонами. Рассмотрим:

scala> val x: Int = 5
x: Int = 5

scala> val x = Int
x: Int.type = object scala.Int

scala> val x: Int = Int
<console>:13: error: type mismatch;
 found   : Int.type (with underlying type object Int)
 required: Int
       val x: Int = Int
                    ^

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

case Some(List(_: Int, _: Boolean, _: Int)) => println("found")
3 голосов
/ 21 сентября 2011

Следующее также работает для Scala 2.8

List(1, true, 3) match {
  case List(a:Int, b:Boolean, c:Int) => println("found")
  case _ => println("not found")
}
...