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

scala – 匹配表达式语法的动机

发布时间:2020-12-16 09:06:12 所属栏目:安全 来源:网络整理
导读:匹配表达式的语法非常好: expr match { case Test(l1) = ... ...} 但它让我疯狂,我不明白为什么使用这种语法而不是匹配(expr)的动机……,就像在一个体面的C后代中的分支语句一样! 我认为没有合理的解释.我没有在Scala编程,Scala网站,in this paper,this th
匹配表达式的语法非常好:

expr match {
    case Test(l1) => ...
    ...
}

但它让我疯狂,我不明白为什么使用这种语法而不是匹配(expr)的动机……,就像在一个体面的C后代中的分支语句一样!

我认为没有合理的解释.我没有在Scala编程,Scala网站,in this paper,this thesis,SO上和网络的其他部分找到答案.

这并不是说它有什么不妥,只是它是一个完全的谜.当匹配工作以这种方式工作时,为什么不呢?

有人知道吗?如果没有发现这一点,我认为我不能再忍受这种语言了.我一直在想.我晚上睡不着觉.

解决方法

为了采用类似的Scala语法,模式匹配情况下的保护不需要围绕其条件表达式的括号 – 例如,以下内容:

case i if i % 2 == 0 => i / 2

就像这样有效:

case i if (i % 2 == 0) => i / 2

坚持C族风格意味着需要后一种形式,即使括号不是消除歧义所必需的. Scala语言设计师决定在这种情况下减少线路噪声,以保持家族相似性.

我猜在匹配语法中有类似的动机,而且我的眼睛匹配(expr){…}与expr match {…}相比确实看起来非常糟糕(和误导).

另外,就在今天下午,我在x map {…}的选项上重构了别人的x匹配{…}.作为中缀运算符匹配使这两个表达式之间的相似性变得清晰.

关于为什么匹配不仅仅是一种方法的问题,这是David Pollak在the scala-debate mailing list年提出的一个为期五年的问题:

Why is ‘match’ a language level construct rather than a method on Any?

和Martin Odersky’s answer:

It used to be that way in Scala 1. I am no longer sure why we changed.
syntax highlighting? error reporting? not sure. I don’t think it
matters much either way,though.

我和马丁在这一次.

请注意,存在一些实际差异(除了简单的“点或非”问题).例如,这不编译:

def foo[A,B](f: PartialFunction[A,B])(a: A) = a match f

如果匹配仍然是Any上的一种方法,那么需要一大堆案例将是一个相当奇怪的要求.

(编辑:李大同)

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

    推荐文章
      热点阅读