我有一个要求,我想隐式转换和Iterable到Option。要求是如果Iterable为空我返回None否则我返回Some(可迭代)。
以下代码
implicit def toOption[T](iterable: Iterable[T]): Option[Iterable[T]] = if (iterable.isEmpty) None else Some(iterable)
val opt = List(6,7,8).toOption
我收到编译错误'值toOption不是其成员 列表[INT]'
我在这里缺少什么?
答案 0 :(得分:3)
如果你想这样做,单独的隐式转换对你没有帮助。您需要的是implicit class :
object Rich {
implicit class RichIterable[T](it: Iterable[T]){
def toOption: Option[Iterable[T]] = if(it.isEmpty) None else Some(it)
}
}
scala> import Rich._
import Rich._
scala> List(1,2,3).toOption
res0: Option[Iterable[Int]] = Some(List(1, 2, 3))
scala> List().toOption
res1: Option[Iterable[Nothing]] = None
答案 1 :(得分:2)
你的调用语法是错误的(toOption不是这种方式的列表方法,它是顶级方法/函数),你需要在类型中不那么具体(所以它可以用于隐式转换等):
implicit def toOption[I <% Iterable[_]](iterable: I): Option[I] = if (iterable.isEmpty) None else Some(iterable)
val opt1: Option[List[Int]] = List(6,7,8)
val opt2: Option[List[Int]] = List()
这里我使用了一个视图(&lt;%),这意味着只要参数可以被强制转换或转换为Iterable type
,就可以了。
你也可以这样编写作业:
val opt2 = List(): Option[List[Int]]
这里有一些关于观点的文档: