scala - Seq[Seq[T]] 没有模式匹配
问题描述
def example1(sss:Seq[Seq[String]]) = sss match {
case Seq(a, b) :+ Seq(c, d) :+ tail => true
}
val res1 = example1(Seq(Seq("a", "b"), Seq("c","d")))
// scala.MatchError: List(List(a, b), List(c, d))
好吧,我有一个解决方法,那就是使用
case Seq(Seq(a, b), Seq(c, d), _*) => true
谁能解释为什么第一个不起作用?
解决方案
您使用了错误的提取器!:+
意味着第一部分是(外部)Seq 的一部分,因此a
和b
是类型Seq[String]
而不是String
,而第二部分Seq(c,d)
和tail
被视为元素,因此c
和d
实际上是String
。
通常这不会进行类型检查,但在元素类型为 a 的情况下Seq
,它会进行检查。但是,如果您假设a
and b
areString
并尝试将它们视为此类,则类型检查器可能会抱怨,从而导致更多混乱。
正确的提取器是+:
. 冒号位于序列的一侧,加号位于元素的一侧。因此
case Seq(a, b) +: Seq(c, d) +: tail => true
符合预期。
推荐阅读
- c++ - v 在不同的 .cpp 文件中使用在 main.cpp 中创建的类型的对象
- git - Github主分支和主分支的区别?
- openssl - 使用 openssl 以特定格式创建 RSA 密钥
- python - 更高维度的 KMeans 聚类是否可行?
- r - 强制 rsconnect::deployApp() 无法测试“on.failure”
- javascript - 如何创建复制到剪贴板?将数据从 h1 标签复制到输入(反应)
- asp.net-core - 无法更新一对多关系(尝试边做边学)
- ruby-on-rails - 在 ElasticSearch 结果中生成/添加搜索词
- javascript - 如何在不重新加载页面的情况下从输入名称中获取变量
- ember-octane - 基于 ember octane 中选择的答案的基于条件的显示部分