List上的模式匹配的意外行为

时间:2014-02-06 13:36:38

标签: scala pattern-matching

为什么以下代码在两种情况下都会打印one

 oneOrList(o: Any) = o match  {
  case List => "list"
  case _ => "one"
}

println(oneOrList(1))
println(oneOrList(List(1, 2)))

2 个答案:

答案 0 :(得分:3)

case List => "list"仅匹配List单例对象。所以它只匹配oneOrList(List) 要匹配列表,请使用:

oneOrList(o: Any) = o match  {
  case x: List[_] => "list"
  case _ => "one"
}

println(oneOrList(1))
println(oneOrList(List(1, 2)))

答案 1 :(得分:3)

List中的case List =>不是类型歧视,它是针对单身{{1}的匹配目标(技术上称为 scrutinee )的测试} object主要用于通过List方法提供List(v1, v2, v3, ...)工厂。