如果我有这样的课程:
class Component (val name, val description, var subElements : Set[Component])
如何测试组件内部是否包含循环(使用布尔函数)以及谁启动了这个循环。我很清楚,如果我使用 val 而不是 var 避免循环,但我不能使用 val。
Component
返回下图中开始循环的所有元素的成员。如果没有循环,则返回一个空集。
def descendantsWithCycle = {
def findCycle(current: Component, checked: Set[Component]): Set[Component] =
if (checked contains current) Set(current)
else {
val newChecked = checked + current
current.subElements.flatMap(findCycle(_, newChecked))
}
findCycle(this, Set())
}
如果您不需要 var,请不要使用它!val 或 var 也一样:
class Component (val name : String, val description : String, val subElements : Set[Component]){
def hasCyle(val seen) : Boolean = (seen contains this ||
subElements.exists(item => item.hasCycle(seen + this)))
def isCyclic = hasCycle(Set())
}
}
如果您看到的列表包含当前项目,或者如果您看到的集合中包含任何子元素以及当前项目,则您可以读取 hasCycle,因为它有一个循环。