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

Scala用于理解/循环和类型化模式

发布时间:2020-12-16 18:59:49 所属栏目:安全 来源:网络整理
导读:根据 Scala语言规范的第6.19节,这个for循环: for (e -p) e' 被翻译成: p - e.withFilter{case p = true; case _ = false}.foreach{case p = e′} 那么,为什么这个小程序: object ForAndPatterns extends App { class A() class B() extends A val list: L
根据 Scala语言规范的第6.19节,这个for循环:

for (e <-p) e'

被翻译成:

p <- e.withFilter{case p => true; case _ => false}.foreach{case p => e′}

那么,为什么这个小程序:

object ForAndPatterns extends App {
  class A()
  class B() extends A

  val list: List[A] = List(new A(),new B(),new B())

  for {b: B <- list}
    println(b)
}

给出了这个编译错误:

Error:(7,13) type mismatch;
 found   : proves.ForAndPatterns.B => Unit
 required: proves.ForAndPatterns.A => ?
   for {b: B <- list}

当这个表达式:

list.withFilter{case a: B => true; case _ => false}.foreach{case b => println(b)}

没有错误.

解决方法

实际上,您从规范中获得的翻译

list.withFilter{case b: B => true; case _ => false}.foreach{case b: B => println(b)}

但它仍然编译和工作.看起来Scala正在失去这个案子并转化为

list.withFilter{case b: B => true; case _ => false}.foreach{b: B => println(b)}

会产生同样的错误.

结果证明这是一个已知的旧bug:https://github.com/scala/bug/issues/900.

解决方法提供:

object Typed { def unapply[A](a: A) = Some(a) }

for { Typed(b: B) <- list } println(b)

(编辑:李大同)

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

    推荐文章
      热点阅读