【问题标题】:Scala factory ignored by compiler?编译器忽略了Scala工厂?
【发布时间】:2012-08-17 12:19:35
【问题描述】:

我花了这么多时间在我的伴生对象中组合一个工厂方法,如下所示:

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)

这是怎么回事!?我刚做了这个!?救命!!!

【问题讨论】:

  • 实际上,如果您正确地将缺少的def 插入到class 中,new Stuff(1, 2) 应该可以正常工作(new Stuff(1, 2L) 也应该如此)。
  • 使用 class Stuff private(...) {...} 将 Stuff 的 ctor 设为私有,不再混淆。
  • 有趣,我不知道类也可以有apply() 工厂。这是在伴随对象工厂之后添加的吗?

标签: scala syntactic-sugar companion-object


【解决方案1】:

年轻的 Scala 程序员,不要害怕,因为答案很简单。您没有正确使用工厂。看,这段代码实际上会做你想做的事:

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

这里的问题是你的语法。当您调用new 时,它会实例化一个新的Stuff 类。但是apply 确实是widget.apply(1,2) 的语法糖,除此之外别无其他。

您还可以在此处了解有关apply 糖的更多信息:How does Scala's apply() method magic work?

保持年轻的编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2013-09-10
    • 1970-01-01
    • 2014-07-19
    • 2019-05-22
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多