3 回答
TA贡献1862条经验 获得超6个赞
你似乎偶然发现了答案。无论如何,我会尽力说清楚。
使用前缀,中缀和后缀表示法时可省略点 - 所谓的运算符表示法。使用运算符表示法时,只有这样,如果传递给方法的参数少于两个,则可以省略括号。
现在,运算符表示法是方法调用的表示法,这意味着它不能在没有被调用的对象的情况下使用。
我将简要介绍一下这些符号。
字首:
只有~
,!
,+
并且-
可以在前缀符号使用。这是当你写你所使用的符号!flag
或val liability = -debt
。
中缀:
这是方法出现在对象和它的参数之间的符号。算术运算符都适合这里。
后缀(也是后缀):
当方法跟随对象并且不接收任何参数时,使用该表示法。例如,您可以编写list tail
,这是后缀表示法。
只要没有方法,就可以毫无问题地链接中缀符号。例如,我喜欢使用以下样式:
(list filter (...) map (...) mkString ", ")
这与以下内容相同:
list filter (...) map (...) mkString ", "
现在,为什么我在这里使用括号,如果filter和map只使用一个参数?这是因为我将匿名函数传递给他们。我不能将匿名函数定义与中缀样式混合,因为我需要一个边界来结束我的匿名函数。此外,匿名函数的参数定义可能被解释为中缀方法的最后一个参数。
您可以使用具有多个参数的中缀:
string substring (start, end) map (_ toInt) mkString ("<", ", ", ">")
使用中缀表示法很难使用Curried函数。折叠功能就是一个明显的例子:
(0 /: list) ((cnt, string) => cnt + string.size)(list foldLeft 0) ((cnt, string) => cnt + string.size)
您需要在中缀调用之外使用括号。我不确定这里的确切规则。
现在,我们来谈谈postfix。Postfix可能很难使用,因为除了表达式的结尾之外,它永远不会被使用。例如,您无法执行以下操作:
list tail map (...)
因为尾部没有出现在表达式的末尾。你不能这样做:
list tail length
您可以使用括号来标记表达式的结尾来使用中缀表示法:
(list tail) map (...) (list tail) length
请注意,不建议使用后缀表示法,因为它可能不安全。
我希望这已经消除了所有的疑虑。如果没有,只需发表评论,我就会看到我可以做些什么来改进它。
添加回答
举报