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)
}
我正在尝试将此脚本 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)
}