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

时间:2019-01-23 06:17:29

标签: scala recursion

我有一个递归函数,它收集kd-tree的叶子节点。此函数必须以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)}

在这里,我在最后两行遇到错误:“类型不匹配,预期:KdNode,实际:Option [KdNode]。

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

val listofBoundingBoxes=collectLeafNodes(tree)

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

谢谢。

3 个答案:

答案 0 :(得分:3)

您在评论中询问如何在没有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.leftNone,则第二个List为空,否则第二个List就是对collectLeafNodes(t.left)的递归调用所返回的值。 (该参数是自动提供的,因此无需指定。)
  3. List的第三个t.right相同

仅针对叶节点进行了修正

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)
}

答案 1 :(得分:2)

您可以映射选项对象:

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

答案 2 :(得分:0)

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

您可以打开Option来解决此问题,例如

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

希望这会有所帮助