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
将报告它。
如果您想要您期望的行为,则:
- 不要将值存储为
Option
s,而是使用普通的 Int
类型,或者
flatten
最后的结果:get(3).flatten
.
如果将 Option
s 放在 Option
s 中,也会发生类似的事情——没有自动扁平化:
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]
.
在你的例子中,V
是 Option[Int]
,所以 get
的结果是 Option[Option[Int]]
。
在 Map 中将 Option
作为值有点不寻常,在大多数情况下,它是多余的,因为您可能根本就没有 map 中的条目而不是存储 None
.
我能想到的一个用例是实现某种缓存:在这种情况下,None
意味着密钥的条目不会退出,而丢失的密钥会表示没有检查过。
在编写一些 Scala 程序时,我意识到以下几点:
Map[Int, Option[Int]]().updated(3, None).get(3)
returns
Some(None)
而不是预期的
None
这似乎很违反直觉。这是预期的行为还是错误。
顺便说一句,我正在使用 Scala 2.13.8。
这是非常符合预期的行为。 Option
和其他任何结构一样是一种“数据结构”,因此编译器方面没有对其进行特殊处理。如果您将 None
与该映射中的键相关联,那么那里就有一个条目,Map
将报告它。
如果您想要您期望的行为,则:
- 不要将值存储为
Option
s,而是使用普通的Int
类型,或者 flatten
最后的结果:get(3).flatten
.
如果将 Option
s 放在 Option
s 中,也会发生类似的事情——没有自动扁平化:
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]
.
在你的例子中,V
是 Option[Int]
,所以 get
的结果是 Option[Option[Int]]
。
在 Map 中将 Option
作为值有点不寻常,在大多数情况下,它是多余的,因为您可能根本就没有 map 中的条目而不是存储 None
.
我能想到的一个用例是实现某种缓存:在这种情况下,None
意味着密钥的条目不会退出,而丢失的密钥会表示没有检查过。