Scala工厂被编译器忽略了吗?

时间:2012-08-22 05:47:23

标签: scala syntactic-sugar companion-object

我花了所有这些时间将一个工厂方法放在我的伴侣对象中,如下所示:

class Stuff(val a: Int, val b: Long) { this() = this(0,0L) }

object Stuff {
  def apply(a:Int, b:Int) = new Stuff(a, b.toLong)
}

但是,当我以为我杀了它时,我就去编译了,这不起作用:

val widget = new Stuff(1,2)

发生什么事了!?我刚做完了!?帮助!

1 个答案:

答案 0 :(得分:7)

年轻的Scala编码器,没有恐惧,因为答案很简单。您没有正确使用工厂。看,这段代码实际上会做你想要的:

val widget = Stuff(1,2)
//makes Stuff(1, 2L)

这里的问题是你的语法。当您致电new时,它会实例化一个新的Stuff类。但是apply widget.apply(1,2)确实是apply的语法糖,而且其他内容并不多。

您还可以在此处详细了解{{1}}糖:How does Scala's apply() method magic work?

继续为年轻人编码。