Option.zip返回List,而不是Option

syn*_*pse 8 scala

标准库文档将zip部分签名描述为def zip[B](that: GenIterable[B]): Option[(A, B)]但不Some(1) zip Some(2)返回.这是一个错误的实施或错误的文档?List((1,2))Some((1,2))

Gab*_*lla 10

Buggy文档.

zip实际上是定义的Iterable,它适用于Option隐式转换option2Iterable(如果你仔细观察,这在文档中明确说明).

因此Option,首先将其转换为a Iterable,然后zip支持该操作.

这是为了代码重用而完成的,但是它忽略了一些Iterable方法,其中方法直接有意义Option而不需要隐式转换.

以下是邮件列表中的相关讨论:https://groups.google.com/forum/#!topic / easla-language/MFU5PPt_jYw

如果您确实需要zip两个选项,则可以使用此解决方法:

(opt1 zip opt2).headOption
Run Code Online (Sandbox Code Playgroud)

此外,正如Travis在评论中指出的那样,您可以选择使用scalaz Zip类型,尽管您必须使用它fzip.

opt1 fzip opt2
Run Code Online (Sandbox Code Playgroud)