加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的方法与函数和含义

发布时间:2020-12-16 08:52:30 所属栏目:安全 来源:网络整理
导读:让我们将def和等效函数声明为val: scala def optional(x:Int):Option[String] = Noneoptional: (x: Int)Option[String]scala val optional2:(Int)=Option[String] = (i:Int) = Noneoptional2: Int = Option[String] = function1 现在为什么这不起作用? sca
让我们将def和等效函数声明为val:

scala> def optional(x:Int):Option[String] = None
optional: (x: Int)Option[String]

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

现在为什么这不起作用?

scala> List(1).flatMap(optional2)
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => scala.collection.GenTraversableOnce[?]
              List(1).flatMap(optional2)
                              ^

虽然这两个都做到了吗?

scala> List(1).flatMap(optional)
res4: List[String] = List()

scala> List(1).flatMap(optional2(_))
res5: List[String] = List()

由于Option不是GenTraversableOnce的子类型,我认为这必须与implicits有关,但我无法弄清楚究竟是什么.我正在使用Scala 2.9.1.

解决方法

隐式转换 Option.option2Iterable是使List(1).flatMap(可选)和List(1).flatMap(optional2(_))工作的原因.

您的问题可归结为隐式转换未被提取:

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

scala> (optional2(_)): Function[Int,Iterable[String]]
res0: Int => Iterable[String] = <function1>

scala> (optional2): Function[Int,Iterable[String]]
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => Iterable[String]

使用下划线时,编译器会尝试键入函数并提供必要的隐式转换.当您只提供optional2时,没有适用的隐式转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读