我知道我们不能通过在伴侣对象上自己定义一个apply()
方法来获得这种效果,但出于所有目的,我最终在Scala代码库中看到的唯一事情就是每个人都会定义apply( )每个类的方法,从而导致很多样板代码。
这个决定有什么理由吗?
答案 0 :(得分:6)
这已经讨论了scala-language mailing list。
Martin Odersky指出:
遗漏
new
的一个问题是匿名课程出现歧义:而不是new Foo(x) { def y = x + x }
你得到:
Foo(x) { def y = x + x }
解析器会拒绝这个,因为它认为大括号{...}包含一个函数参数, 所以不允许定义。
我还要补充说,你会遇到无参数构造函数的问题。像
class Foo
你如何实例化这个,特别是如果有一个伴侣对象?当然,可以将这些案例new
保留为可选关键字。
更理论的反思是,在class Foo
中,Foo
是一种类型而不是一种价值。通常,您无法调用某种类型的任何方法,例如合成apply()
或假设的.new()
。对于案例类apply
是在伴随对象上定义的,是值。然后向任何类添加合成apply
意味着您总是为任何类获得(合成)伴随对象。
取消new
是不可能的。在实验性的Scala-Virtualized项目中do have a virtual new
。对于同样的美学问题,人们可以放弃if
和while
等。