我总是想知道为什么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设计师“发明”这种遗漏的目的是什么?我们鼓励使用这种风格吗?
答案 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表示:
模块提供的所有服务都应通过制服提供 符号,它不会背叛它们是否通过实施 存储或通过计算
实际上,这意味着用于操纵属性(存储)和方法(计算)的语法应该是相同的
这个原则也带来了一些最终的问题:如果你正在访问一个需要昂贵计算的值(例如一个繁重的数据库查询)并且你不知道成本,那么系统可能会变慢。
有时候你并不关心下面的实现,有时候你必须要注意它。