"v1"), ("k2" -> 10)) 现在让我们写一个 for : scala> for ((a, b)-6ren">
gpt4 book ai didi

scala - 为什么在 for comprehension 中这两种模式匹配之间的行为存在差异?

转载 作者:行者123 更新时间:2023-12-03 18:15:12 24 4
gpt4 key购买 nike

考虑这个 Map[String, Any] :

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

现在让我们写一个 for :
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

在这里,当我指定一个类型时,会进行过滤,这很棒。

现在说我想使用 Array[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)
    请注意,在 Scala 3 中,您可以:
    for (case v: String <- l1) println(v)

    关于scala - 为什么在 for comprehension 中这两种模式匹配之间的行为存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952124/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com