Map[Int, Option[Int]] returns 一些(None)

Map[Int, Option[Int]] returns Some(None)

在编写一些 Scala 程序时,我意识到以下几点:

Map[Int, Option[Int]]().updated(3, None).get(3)

returns

Some(None)

而不是预期的

None

这似乎很违反直觉。这是预期的行为还是错误。

顺便说一句,我正在使用 Scala 2.13.8。

这是非常符合预期的行为。 Option 和其他任何结构一样是一种“数据结构”,因此编译器方面没有对其进行特殊处理。如果您将 None 与该映射中的键相关联,那么那里就有一个条目,Map 将报告它。

如果您想要您期望的行为,则:

  1. 不要将值存储为 Options,而是使用普通的 Int 类型,或者
  2. flatten最后的结果:get(3).flatten.

如果将 Options 放在 Options 中,也会发生类似的事情——没有自动扁平化:

scala> Option(None)
val res0: Option[None.type] = Some(None)

scala> .flatten
val res1: Option[Nothing] = None

是的,正如您可以从 Map.get 的签名中清楚地看到的那样,这是预期的行为:def get(key: K): Option[V] .

在你的例子中,VOption[Int],所以 get 的结果是 Option[Option[Int]]

在 Map 中将 Option 作为值有点不寻常,在大多数情况下,它是多余的,因为您可能根本就没有 map 中的条目而不是存储 None.

我能想到的一个用例是实现某种缓存:在这种情况下,None 意味着密钥的条目不会退出,而丢失的密钥会表示没有检查过。