斯卡拉玩;地图上的模式匹配;无法解析 Map.unapply

Scala play; pattern matching on Map; cannot resolve Map.unapply

我使用 scala play 框架并有这个简单的模板:

@defining({
    Map("a" -> 1, "b" -> 2)
}) { case Map("a" -> aValue, *) =>
    <div>
        this is a value: @a
    </div>
}

IntelliJ Idea 在 case Map(... 中下划线 Map,表示它 "Cannot resolve method Map.unapply" 并且它还 "Cannot resolve symbol Map".

将实现从 Map 更改为 ListSeq 会使红色下划线消失,但我想使用可按键搜索的结构,其项目是顺序无关。任何想法如何使模式匹配在定义块内使用 Scala Play 在 Map 上工作?

根据API docs Map does not have unapplySeq method and thus cannot be pattern matched out-of-the-box. You could try adding your own as suggested here

看来您要做的只是显示地图中存在的值。

如果你有这样的地图:

val myMap = Map("a" -> 1, "b" -> 2)

您可以像这样在播放模板中使用它:

@myMap.get("a").map { aValue =>
  <div>this is a value: @aValue</div>
}

myMap.get("a") return 一个 Option。在这种情况下它将 return Some(1),而如果未定义给定键的值,它将 return None

当您在模板中的 Option 上调用 .map 时,它将 return 您传递给 .map 的表达式的结果值,如果 Option 不为空(不是 None)。否则,它将 return 一个空字符串,即不显示任何内容,这正是您所需要的。