我知道我们不能通过自己定义apply()
伴随对象上的方法来获得这种效果,但出于所有目的,我最终在Scala代码库中看到的唯一事情就是每个人都只为每个类定义apply()方法,从而导致很多样板代码.
例如,F#将允许默认情况下没有new的对象的实例化(除了一次性用品).
这个决定有什么理由吗?
这已经在scala语言邮件列表上讨论了一段时间.
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项目中,您确实拥有虚拟化new
.出于同样的审美问题,一个可能已经完结了if
和while
等