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

何时在Scala中缀符号中使用括号

发布时间:2020-12-16 09:14:55 所属栏目:安全 来源:网络整理
导读:在 Scala编程时,我做的功能越来越多.但是,当使用中缀符号时,很难判断何时需要括号,而当您不需要括号时. 例如下面的代码片段: def caesar(k:Int)(c:Char) = c match { case c if c isLower = ('a'+((c-'a'+k)%26)).toChar case c if c isUpper = ('A'+((c-'A
在 Scala编程时,我做的功能越来越多.但是,当使用中缀符号时,很难判断何时需要括号,而当您不需要括号时.

例如下面的代码片段:

def caesar(k:Int)(c:Char) = c match {
    case c if c isLower => ('a'+((c-'a'+k)%26)).toChar
    case c if c isUpper => ('A'+((c-'A'+k)%26)).toChar
    case _ => c
}

def encrypt(file:String,k:Int) = (fromFile(file) mkString) map caesar(k)_

(fromFile(file)mkString)需要括号才能编译.删除后,我收到以下错误:

Caesar.scala:24: error: not found: value map
    def encrypt(file:String,k:Int) = fromFile(file) mkString map caesar(k)_
                                                                 ^
one error found

mkString显然返回一个字符串(通过隐式转换AFAIK)可以使用map函数.

为什么这个特殊情况需要括号?有什么时候和为什么需要它的一般准则?

解决方法

这是我在阅读规格后为自己整理的东西:

>任何采用单个参数的方法都可以用作中缀运算符:a.m(b)可以写成m b.
>任何不需要参数的方法都可以用作postfix操作符:a.m可以写成m.

例如a.##(b)可以写成一个## b和一个.可以写一个!

> Postfix操作符的优先级低于中缀操作符,因此foo bar baz表示foo.bar(baz),而foo bar baz bam意味着(foo.bar(baz)).bam和foo bar baz bam bim意味着(foo.bar(baz )).BAM(BIM).
>还给出了对象a的无参数方法m,a.m.m是有效的,但是m m不像exp1 opexp2那样解析.

因为有一个mkString的版本需要一个参数,它将被看作是fromFile(file)mkString map caesar(k)_中的一个中缀操作符.还有一个版本的mkString不需要使用一个postfix操作符的参数:

scala> List(1,2) mkString
res1: String = 12

scala> List(1,2) mkString "a"
res2: String = 1a2

有时通过在正确的位置添加点,您可以获得所需的优先级,例如fromFile(file).mkString map {}

并且所有这些优先事项在打字和其他阶段之前发生,所以即使列表mkString映射函数没有意义,因为list.mkString(map).function,这是如何解析的.

(编辑:李大同)

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

    推荐文章
      热点阅读