编写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设计师"发明"此类遗漏的目的是什么?我们是否鼓励使用这种风格?

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

这个想法是,length是一种方法还是直接访问属性。无论哪种方式,它都可以为您提供长度,并且与您所做的事情没有根本的区别,而这只是获得了一个值,并且它的定义并不重要。按照惯例,括号表明正在进行某种副作用,例如打印以进行stdout或突变值。

对于您来说,第二个示例,写这样的代码非常奇怪,但是infix符号可能非常有用。

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

有关括号,请参见http://docs.scala-lang.org/style/naming-conventions.html下的"括号"。"应作为任何形式的登录器(封装字段或逻辑属性(的方法在没有括号的情况下声明,除非它们具有副作用"。有关方法调用(使用/输出点(,请参见http://docs.scala-lang.org/style/method-invocation.html。通常建议使用点,以避免歧义。

括号的可选用法是因为统一的访问原则:

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

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

此原理还带来了一些最终的问题:如果您要访问需要昂贵计算的值(例如,重型数据库查询(,并且您不知道成本,则系统可能会变得慢。

有时您不在乎下面的实现,有时您必须意识到它。

最新更新