【问题标题】:In Scala, what happens when an inner object extends the enclosing class?在 Scala 中,当内部对象扩展封闭类时会发生什么?
【发布时间】:2012-07-23 19:25:37
【问题描述】:

我在 Scala 中编写了一个矩阵类,我认为实现转置操作的最佳方法是只返回一个包含所有“转置”操作的接口。因此,如果matrix.apply(i, j) 返回第 (i, j) 个元素,则 matrix.transpose 返回一个接口(但不是数据的副本),其中包含一个返回 matrix(j, i) 的 apply 方法。我写的界面有点像这样(我真正写的更混乱):

abstract class Matrix {
   def apply(i : Int, j : Int) : Double
   //other matrixy operations
   private def outer = this //so the inner can see the enclosing instance
   object TransposedInterface extends Matrix {
      def apply(i :Int, j : Int) = outer(j, i)
   }
}

我猜这很可爱,但现在TransposedInterface 内部还有一个名为TransposedInterface 的对象,以此类推,递归地,这一切都在哪里结束?

我在解释器中尝试了以下操作:

class Outer(val i : Int) {
   object Inner extends Outer(i + 1)
}

val o = new Outer(1)
o.Inner.Inner.Inner.Inner.i

我猜它应该运行并评估为 5。

那么实际上发生了什么?内部对象是否懒惰地评估?不立即使用时是否会进行垃圾收集,然后在下次调用 external.Inner 时再次实例化?是我没想到的巫毒吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    它是惰性实例化的,在外部类被收集之前不会被垃圾回收,因为外部类包含对它的引用。

    一般来说,object Foo { ... } 的行为与lazy val Foo = { ... } 非常相似。由于对象在有效时不能为空,但肯定是对象,因此在这种情况下它们更有效(更快地检查存在 - 只查看字段是否为空),但缺点是需要第二个 .class 文件。 (你通常不关心有多少类文件,所以这可能没什么大不了的。)

    【讨论】:

    • 谢谢!事实证明,知道答案会更容易找到the answer
    猜你喜欢
    • 2013-01-27
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多