来自 Oderskey 和 Venners 的规范“Scala 编程”:
scala> val results = List(Some("apple"), None,
Some("orange"))
results: List[Option[java.lang.String]] = List(Some(apple),
None, Some(orange))
scala> for (Some(fruit) <- results) println(fruit)
apple
orange
我不明白 scala 的哲学强加给程序员明确提及 Some(apple) 而不是推断它的需要。我更愿意写/看以下内容:
scala> val results = List("apple", None, "orange")
results: List[Option[java.lang.String]] = List(apple, None, orange)
scala> for (fruit <- results) println(fruit)
apple
orange
或者至少是以下(提供在列表级别而不是在单个项目级别输入):
scala> val results :List[Option[String]] = ("apple", None, "orange")
results: List[Option[java.lang.String]] = List(apple, None, orange)
scala> for (fruit <- results) println(fruit)
apple
orange
至少在最后一种情况下:提供了 List 的类型(以帮助编译器..),但我们仍然避免像 Some('foo') 那样将 List 中的每个元素“装箱”的冗长。
任何更符合 scala 思维方式的人都可以告诉我为什么我必须做额外的打字..?
编辑:所以以下是我想要的字符串。
scala> implicit def toOpt(a : String) = Some(a)
toOpt: (a: String)Some[String]
scala> val myList : List[Option[String]] = List("first", None, "third")
myList: List[Option[String]] = List(Some(first), None, Some(third))
如果有人可以展示如何使用更高种类的类型来概括上述内容,我将奖励答案。