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

lse*_*ohn 2 scala

我一直在想为什么Scala的设计能够省略点和括号.这让我很困惑.例如,

"hello".length() can be written as
"hello".length
Run Code Online (Sandbox Code Playgroud)

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

"hello".length() is calling the object's length() function
"hello".length is calling the object's private/public variable. 
Run Code Online (Sandbox Code Playgroud)

它们完全不同.

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

val myStr="hello world"
myStr substring(0, 3) toUpperCase() indexOf "h"
Run Code Online (Sandbox Code Playgroud)

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

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

puh*_*len 8

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

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

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

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