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

扩展Scala的箭头符号成对

发布时间:2020-12-16 09:32:00 所属栏目:安全 来源:网络整理
导读:Predef中的Scala定义了对的支持。和→(这里清理了一下): final class ArrowAssoc[A](val __leftOfArrow: A) extends AnyVal { def - [B](y: B): Tuple2[A,B] = Tuple2(__leftOfArrow,y) def →[B](y: B): Tuple2[A,B] = -(y)} 这方便您使用箭头符号而不是纯
Predef中的Scala定义了对>的支持。和→(这里清理了一下):

final class ArrowAssoc[A](val __leftOfArrow: A) extends AnyVal {    
    def -> [B](y: B): Tuple2[A,B] = Tuple2(__leftOfArrow,y)
    def →[B](y: B): Tuple2[A,B] = ->(y)
}

这方便您使用箭头符号而不是纯文本语法创建对:

scala> "foo" → 42
res0: (String,Int) = (foo,42)

可以使用类型定义和提取器轻松扩展此箭头语法(此处仅显示→):

type →[A,B] = (A,B)
object → { def unapply[A,B](t: (A,B)) = Some(t) }

这样你可以写出如下的东西:

"a" → 42 match { case a → b ? println(s"found `$a` and `$b`") }

和:

def foo[A,B](t: A → B) = ???

我想知道是否有任何原因Scala在其标准库中也没有定义它们。这些定义有什么缺点吗?

解决方法

这是一个缺点。能够做到这两个

def foo[A,B](t: A -> B) = ???

def foo[A,B](t: A => B) = ???

会令人困惑如果类型不排队,编译器当然会抓住它。但是,只有经验丰富的Scala程序员才能快速了解错误信息。

(编辑:李大同)

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

    推荐文章
      热点阅读