加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 匹配选项元组

发布时间:2020-12-16 09:49:32 所属栏目:安全 来源:网络整理
导读:我有: val foo = Some(List(1,2,3)) - Some("y") 我想投射它: foo match { case (Some(x),Some(y)) = println(x + " " + y) case _ = println("error") 这适用于某些(列表(1,3) – 一些(“得分”))但对某些(列表(1,3) – 无,无 – 一些(“y”)失败“)或无
我有:

val foo = Some(List(1,2,3)) -> Some("y")

我想投射它:

foo match {
    case (Some(x),Some(y)) => println(x + " " + y)
    case _ => println("error")

这适用于某些(列表(1,3) – >一些(“得分”))但对某些(列表(1,3) – >无,无 – >一些(“y”)失败“)或无 – >无:

error: constructor cannot be instantiated to expected type;
     found   : Some[A]
     required: None.type
error: not found: value ...

这是为什么?

当然我可以使用getOrElse(),但看起来并不那么优雅.

多谢,
卡斯滕

更新:

foo match {
 case (x: Some[List[Int]],y: Some[Int]) => println(x.get)
 case _ => println("error")
}

失败也是:

error: pattern type is incompatible with expected type;
 found   : Some[Int]
 required: None.type

我认为案件_会照顾到这一点.

解决方法

编译器会告诉你一些事情.如果你有一个表达式

val foo = Some(List(1,3)) -> None

它将具有类型(Some [List [Int]],None.type),您可以通过在scala控制台中键入表达式轻松查看

scala> val foo = Some(List(1,3)) -> None
foo: (Some[List[Int]],None.type) = (Some(List(1,3)),None)

因此,您在编译时知道元组的第二个元素只能是None,与Some的匹配永远不会成功.因此错误消息.

如果你给foo一个限制较少的类型它会起作用.

val foo : (Option[List[Int]],Option[String]) = Some(List(1,3) -> None

请注意,这完全是应该的.匹配一些永远不会发生的事情几乎肯定是一个错误.您必须向上转换为任何以避免编译时错误(但随后您将收到运行时错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读