Scala Option 类可以用作函数参数吗?



我有一个递归函数,它收集kd树的叶节点。此函数必须将 KdNode 作为参数。KdNode 具有以下类定义:

case class KdNode(value: (Double, Double), left: Option[KdNode], right: Option[KdNode], axis: Int, BB_A:BoundingBox, BB_B:BoundingBox)

将其作为参数的函数定义为:

def collectLeafNodes(t:KdNode): List[BoundingBox] = {
if(t == None) return
if (t.left == None && t.right == None) {
  Some(listBoundingBox.::(t.BB_A,t.BB_B))
  return
}
collectLeafNodes(t.left)
collectLeafNodes(t.right)}

在这里,我在最后 2 行遇到错误,说:"类型不匹配,预期:KdNode,实际:选项 [KdNode]。

我通过在变量"树"中构建 kd-tree 并将其作为参数来调用此函数:

val listofBoundingBoxes=collectLeafNodes(tree)

在这种情况下,可能的解决方法是什么?此外,我认为应该有一种方法可以将根节点而不是树传递给 collectLeafNodes 函数,这是可能的,因为树是在单独的函数中构建的。

谢谢。

您在评论中问如何在没有return的情况下完成.这是一种方法。

def collectLeafNodes(t :KdNode) :List[BoundingBox] =
  List(t.BB_A, t.BB_B) :::
    t.left.fold(List.empty[BoundingBox])(collectLeafNodes) :::
    t.right.fold(List.empty[BoundingBox])(collectLeafNodes)

结果,没有return,是 3 个列表的串联:

  1. 由于tKdNode而不是Option[KdNode],我们知道BB值是真实的。那是第一List.
  2. 如果t.left None则第 2 个List为空,否则第 2 List是递归调用返回collectLeafNodes(t.left)的任何内容。(参数是自动提供的,因此无需指定。
  3. 第 3 Listt.right
  4. 相同

仅针对叶节点进行了更正

def collectLeafNodes(t :KdNode) :List[BoundingBox] = {
  if (t.left.isEmpty && t.right.isEmpty) List(t.BB_A, t.BB_B)
  else t.left .fold(List.empty[BoundingBox])(collectLeafNodes) :::
       t.right.fold(List.empty[BoundingBox])(collectLeafNodes)
}

您可以在选项对象上进行映射:

val res: List[BoundingBox] = t.left.map(collectLeafNodes).getOrElse(List())

因为 t.right 是 Option 的类型,而不是 Kdnode 的类型。

您可以解开包装选项来解决此问题,例如

collectLeafNodes(t.right.get)}
collectLeafNodes(t.right.orElse(None)}

希望这有帮助

最新更新