在“Scala编程”的第10章第10章中,Element的定义定义了一个函数/方法“above”,它返回一个新的ArrayElement。但是ArrayElement扩展了Element。
在尝试输入示例时,我实际上得到了我所期望的......关于这些定义的循环依赖性的抱怨。
我错过了什么?
答案 0 :(得分:4)
在这种情况下,循环定义不是问题,因为返回类型不是循环的,并且可以在解析类型后的第二遍中解析实现。
例如 - 并注意我将所有内容包装在一个对象中,以便REPL一次性考虑所有内容:
object Example {
abstract class E {
def a: Int
def e: E = new AE(2)
}
class AE(val a: Int) extends E { }
}
这可以按预期工作:
scala> val ae = new Example.AE(0)
ae: Example.AE = Example$AE@57240e
scala> ae.a
res1: Int = 0
scala> ae.e.a
res2: Int = 2
我的猜测是,当你输入时,你试图让REPL只接受循环定义的 part ,或者你遗漏了允许循环的东西要在类型中解决(例如,如果您将回复键入AbstractElement
而不是Element
,那将会令人困惑!)。
无论如何,代码原样对我来说没问题。
答案 1 :(得分:1)
我相信您应该已经生效了第196页的ArrayElement
定义。
答案 2 :(得分:1)
你可以像这样包装源文件中的所有内容:
layout {
... code goes here...
}
然后在REPL中你可以:加载[你的文件]并执行
layout.Element.elem("bla bla bla")