何时在Scala中缀符号中使用括号
在
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. 例如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). 因为有一个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,这是如何解析的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |