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

scala – 为什么在理解中这两种模式匹配之间的行为存在差异?

发布时间:2020-12-16 09:26:47 所属栏目:安全 来源:网络整理
导读:考虑这个Map [String,Any]: val m1 = Map(("k1" - "v1"),("k2" - 10)) 现在让我们写一个: scala for ((a,b) - m1) println(a + b)k1v1k210 到现在为止还挺好. 现在让我们指定第二个成员的类型: scala for ((a,b: String) - m1) println(a + b)k1v1scala f
考虑这个Map [String,Any]:

val m1 = Map(("k1" -> "v1"),("k2" -> 10))

现在让我们写一个:

scala> for ((a,b) <- m1) println(a + b)
k1v1
k210

到现在为止还挺好.

现在让我们指定第二个成员的类型:

scala> for ((a,b: String) <- m1) println(a + b)
k1v1

scala> for ((a,b: Integer) <- m1) println(a + b)
k210

在这里,当我指定一个类型时,会发生过滤,这很好.

现在说我想使用数组[Any]代替:

val l1 = Array("a",2)

事情破裂了:

scala> for (v: String <- l1) println(v)
<console>:7: error: type mismatch;
 found   : (String) => Unit
 required: (Any) => ?

我的双重问题是:

>为什么第二次匹配过滤器也没有呢?
>有没有办法在不使用脏isInstanceOf的情况下在第二种情况下表达这种过滤?

解决方法

好吧,后一个例子不起作用,因为它没有规定.关于什么是合理的行为有一些讨论.就个人而言,我希望它能像你一样工作.问题在于:

val v: String = (10: Any) // is a compile error
(10: Any) match {
    case v: String =>
} // throws an exception

如果您不相信这一点,请加入club. :-)这是一个解决方法:

for (va @ (v: String) <- l1) println(v)

(编辑:李大同)

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

    推荐文章
      热点阅读