在编写Scala代码时省略点和括号是一个好习惯吗?

时间:2017-04-16 00:58:43

标签: scala

我总是想知道为什么Scala能够省略点和圆括号。这让我很困惑。例如,

"hello".length() can be written as
"hello".length

它造成了混乱:在C ++编码器的角度来看,

"hello".length() is calling the object's length() function
"hello".length is calling the object's private/public variable. 

它们完全不同。

此外,它连线读取没有点的代码,如下所示:

val myStr="hello world"
myStr substring(0, 3) toUpperCase() indexOf "h"

看起来句子尚未完成。它也不节省空间,我们仍然需要使用空白“”而不是“。”。

Scala设计师“发明”这种遗漏的目的是什么?我们鼓励使用这种风格吗?

3 个答案:

答案 0 :(得分:8)

在第一种情况下,是的。建议在没有括号的情况下使用没有参数且没有副作用的方法。如果有副作用,请使用括号。

这个想法是,length是方法还是直接访问属性并不重要。无论哪种方式,它只是给你一个长度,并且你正在做的事情没有根本的区别,只是得到一个值,并且无关紧要。按照惯例,括号表示存在一些副作用,例如打印到stdout或改变值。

对于你的第二个例子,是的,编写这样的代码会很奇怪,但是中缀符号可能非常有用。

例如,您可以写1 + 2而不是1.+(2)。我想你可以同意第一个是可取的。它还为编写漂亮的DSL提供了可能性,这些DSL不需要点和括号,这是目标之一。在典型的使用中,我会避​​免使用非符号(英语)方法。

答案 1 :(得分:4)

关于括号,请参阅"圆括号"在http://docs.scala-lang.org/style/naming-conventions.html下。 "作为任何种类的访问者(封装字段或逻辑属性)的方法应该在没有括号的情况下声明,除非它们有副作用"。对于方法调用(带/出点),请参阅http://docs.scala-lang.org/style/method-invocation.html。通常建议使用圆点,以避免歧义。

答案 2 :(得分:1)

括号的可选用法是因为uniform access principle表示:

  

模块提供的所有服务都应通过制服提供   符号,它不会背叛它们是否通过实施   存储或通过计算

实际上,这意味着用于操纵属性(存储)和方法(计算)的语法应该是相同的

这个原则也带来了一些最终的问题:如果你正在访问一个需要昂贵计算的值(例如一个繁重的数据库查询)并且你不知道成本,那么系统可能会变慢。

有时候你并不关心下面的实现,有时候你必须要注意它。