我在 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 时再次实例化?是我没想到的巫毒吗?