据我所知,在Scala中,我们可以通过在名称后面使用空括号或根本没有括号来定义一个没有参数的函数,而这两个定义不是同义词。区分这两种语法的目的是什么?什么时候应该更好地使用一种而不是另一种?为什么要在Scala中使用空括号,如果我们可以不使用括号来定义一个不需要任何参数的函数?
回答
这主要是一个约定的问题。按照惯例,带有空白参数列表的方法评估其副作用。假定没有参数的方法是无副作用的。这是公约。
Scala的风格指南说省略括号,只有当被调用的方法没有任何副作用: http://docs.scala-lang.org/style/method-invocation.html
其他的答案是伟大的,但我也认为这是值得一提的是无PARAM方法能够很好的访问一个类领域,比如:
person.name
由于参数的方法,你可以很容易地编写拦截方法读取(或写)到“姓名”字段不破坏调用代码,像这样
def name = { log("Accessing name!"); _name }
这就是所谓的Uniform Access Principal
我还有一个光提请大会鼓励空括号的有用性功能的声明块(因而后来打给他们的电话)与副作用。
它与调试器。
如果在调试器中添加一个手表,例如process
,该手表会引用关注的调试环境中的布尔值作为示例,或者作为变量视图,或者作为纯副作用自由函数评估,为以后的故障排除带来了严重的风险。 事实上,只要你改变上下文(改变线程,移动到调用堆栈,到达另一个断点...),如果调试器保持这种观察是一种尝试评估的事情,我发现至少是这种情况IntelliJ IDEA的,或Visual Studio为其他语言,然后在任何浏览范围将被触发可能发现的任何其他process
功能的副作用...
试想那种令人费解的故障排除这可能导致如果你这样做因为一些无辜的常规命名,所以没有想到这个警告。如果惯例被强制执行,在我的示例中,process
布尔评估将永远不会回调到调试器手表中的process()
函数调用;它可能只是允许在你的调试器中明确地访问()函数把process()
放在手表中,但是很显然你不直接访问任何属性或局部变量,并且回退到其他浏览范围中的其他process()
函数,如果也许是不幸的,至少会不那么令人惊讶。
- 1. 为什么括号需要
- 2. JavaScript即时函数调用 - 为什么函数需要括号?
- 3. 是否可以创建一个不需要括号的自定义函数?
- 4. 为什么“typeof”不需要括号?
- 5. 为什么我需要在RegEx中使用双曲括号?
- 6. 在某些情况下,为什么我们不需要在JavaScript函数定义附近添加一对括号?
- 7. 为什么需要两个括号在c/C++中使用宏?
- 8. 为什么我们需要添加括号来评估JSON?
- 9. 为什么我的函数需要括号?
- 10. 为什么在这个lambda函数周围需要括号?
- 11. C++构造函数重载 - 为什么说我需要括号?
- 12. 为什么在这里需要括号?
- 13. 为什么函数里面的函数不需要括号? JavaScript的?
- 14. 为什么C#在表达式中使用可空字符时需要括号?
- 15. 为什么IE在我们调用一个函数不接受括号
- 16. 为什么打印一个整数的__repr__需要括号?
- 17. 为什么要在arity-1方法调用中使用括号括号?
- 18. 为什么总和函数的参数需要放在括号内?
- 19. RESTLER:使用括号来指定参数
- 20. 为什么我们需要围绕宏块的括号?
- 21. 为什么JavaScript的eval需要括号来评估JSON数据?
- 22. 使用圆括号代替大括号定义bash函数体
- 23. 为什么我的serialVersionUID后需要一个大括号?
- 24. 可能调用单参数Python函数而不使用括号?
- 25. 为什么我需要在ES6中用数字括号包装一些导入?
- 26. 为什么函数组合需要括号?
- 27. 我需要在Ruby中使用圆括号来表示吗?
- 28. 为什么使用括号来包装javascript函数调用?
- 29. 为什么numpy.r_使用括号而不是括号?
- 30. 如何正确使用强制使得不需要括号?
那么,你会怎么做一个工厂方法?你会写'def createAccount:Account'或'def createAccount():Account'? – David 2010-10-07 01:53:19
对于完全习惯的Scala,工厂方法通常写在伴侣对象上,并命名为“apply”。然后,您可以使用apply:Account(args)的特殊语法创建对象。 – 2010-10-07 03:09:38
无论空参数列表如何,编译器都会接受重写定义:http://pastie.org/1204728。在Language Specification中查找字符串“空参数列表”。 – mkneissl 2010-10-07 06:29:54