Scala some_case_class 参数不是 Option[some_case_class] 的成员

Scala some_case_class paramet is not a member of Option[some_case_class]

我正在尝试将此脚本 https://www.kaggle.com/paulantoine/light-gbm-benchmark-0-3692/code 重写为 Scala,并且需要从两个案例 类 中获取信息并将其合并为一个。捐助者 类 是:

case class Prods1(product_name: String, aisle_id: Int, department_id: Int)
case class Prods2(orders: Int, reorders: Int)

加入后他们看起来像这样:

(Int, (Prods1, Option[Prods2]))

然后我需要将它们转换为:

case class Product(product_id: Int, product_name: String, aisle_id: Int, department_id: Int, orders: Option[Int], reorders: Option[Int])

它是通过以下函数完成的:

def parse_products(product_data: (Int, (Prods1Data, Option[Prods2Data]))) = {
    val product_id = product_data._1
    val product_name = product_data._2._1.product_name
    val aisle_id = product_data._2._1.aisle_id
    val department_id = product_data._2._1.department_id
    var orders = None
    var reorders = None
    if(product_data._2._2.isDefined){
        val p2 = product_data._2._2
        orders = p2.orders
        reorders = p2.reorders
    }
    Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}

我收到以下错误:

error: value orders is not a member of Option[Prods2]
   orders = p2.orders
               ^
error: value reorders is not a member of Option[Prods2]
   reorders = p2.reorders
                 ^

我也尝试了另一种选择:

def parse_products(product_data: (Int, (Prods1, Option[Prods2]))) = {
    val product_id = product_data._1
    val product_name = product_data._2._1.product_name
    val aisle_id = product_data._2._1.aisle_id
    val department_id = product_data._2._1.department_id
    product_data._2._2 match {
        case Some(p2) => {
            val orders = p2.orders
            val reorders = p2.reorders
        }
        case None => {
            val orders = None
            val reorders = None
        }
    }
    Product(product_id, product_name, aisle_id, department_id, orders, reorders, reorder_ratio)
}

这样我又得到了另一个错误:

error: not found: value orders
   Product(product_id, product_name, aisle_id, department_id, orders, reorders)
                                                              ^
error: not found: value reorders
   Product(product_id, product_name, aisle_id, department_id, orders, reorders)
                                                                      ^

如果您觉得可行,请更正这两个选项,因为我这样做是为了学习,这两种结构对我来说都非常有用,在此先感谢您。

最后,我就这样做了,关于"get"的评论很有用,但还有一些需要更正的地方:

def parse_products(product_data: (Int, (Prod1, Option[Prod2]))) = {
    val product_id = product_data._1
    val product_name = product_data._2._1.product_name
    val aisle_id = product_data._2._1.aisle_id
    val department_id = product_data._2._1.department_id
    var orders: Option[Int] = None
    var reorders: Option[Int] = None
    if(product_data._2._2.isDefined){
        val p2 = product_data._2._2.get
        orders = Some(p2.orders)
        reorders = Some(p2.reorders)
    }
    Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}

您可以 return 来自 match 的元组并分配给两个单独的变量,它使代码更短并且看起来更清晰。

def parse_products(product_data: (Int, (Prods1, Option[Prods2]))): Product = {
    val product_id = product_data._1
    val product_name = product_data._2._1.product_name
    val aisle_id = product_data._2._1.aisle_id
    val department_id = product_data._2._1.department_id
    val (orders, reorders) = product_data._2._2 match {
        case Some(p2) => (Some(p2.orders), Some(p2.reorders))
        case None => (None, None)
    }
    Product(product_id, product_name, aisle_id, department_id, orders, reorders)
}