2010-10-07 18 views

回答

31

这主要是一个约定的问题。按照惯例,带有空白参数列表的方法评估其副作用。假定没有参数的方法是无副作用的。这是公约。

+0

那么,你会怎么做一个工厂方法?你会写'def createAccount:Account'或'def createAccount():Account'? – David 2010-10-07 01:53:19

+5

对于完全习惯的Scala,工厂方法通常写在伴侣对象上,并命名为“apply”。然后,您可以使用apply:Account(args)的特殊语法创建对象。 – 2010-10-07 03:09:38

+0

无论空参数列表如何,编译器都会接受重写定义:http://pastie.org/1204728。在Language Specification中查找字符串“空参数列表”。 – mkneissl 2010-10-07 06:29:54

1

其他的答案是伟大的,但我也认为这是值得一提的是无PARAM方法能够很好的访问一个类领域,比如:

person.name 

由于参数的方法,你可以很容易地编写拦截方法读取(或写)到“姓名”字段不破坏调用代码,像这样

def name = { log("Accessing name!"); _name } 

这就是所谓的Uniform Access Principal

+0

这是为了设置属性太?? – Ivan 2010-10-16 08:17:34

+0

我的例子是为了得到,这里的设置 def name _ =(name:String)= {_name = name} – 2010-10-16 12:08:03

+0

是的,我使用这个。但我想知道,这是否意味着“name_ =”或“name _ =”? – Ivan 2010-10-16 14:27:27

0

我还有一个光提请大会鼓励空括号的有用性功能的声明块(因而后来打给他们的电话)与副作用。

它与调试器

如果在调试器中添加一个手表,例如process,该手表会引用关注的调试环境中的布尔值作为示例,或者作为变量视图,或者作为纯副作用自由函数评估,为以后的故障排除带来了严重的风险。 事实上,只要你改变上下文(改变线程,移动到调用堆栈,到达另一个断点...),如果调试器保持这种观察是一种尝试评估的事情,我发现至少是这种情况IntelliJ IDEA的,或Visual Studio为其他语言,然后在任何浏览范围将被触发可能发现的任何其他process功能的副作用...

试想那种令人费解的故障排​​除这可能导致如果你这样做因为一些无辜的常规命名,所以没有想到这个警告。如果惯例被强制执行,在我的示例中,process布尔评估将永远不会回调到调试器手表中的process()函数调用;它可能只是允许在你的调试器中明确地访问()函数把process()放在手表中,但是很显然你不直接访问任何属性或局部变量,并且回退到其他浏览范围中的其他process()函数,如果也许是不幸的,至少会不那么令人惊讶。

相关问题