scala模式匹配-在case类中绑定单个属性
我有一个case类,其中包含一长串属性,例如:scala模式匹配-在case类中绑定单个属性,scala,Scala,我有一个case类,其中包含一长串属性,例如: case class Item(itemCode: ID, itemType: String, itemName: String, manufacturerName: String, manufactureCountry: String, manufacturerItemDescriptio
case class Item(itemCode: ID,
itemType: String,
itemName: String,
manufacturerName: String,
manufactureCountry: String,
manufacturerItemDescription: String,
unitQty: String,
quantity: Double,
bIsWeighted: Int,
unitOfMeasure: String,
qtyInPackage: Int,
itemPrice: Double,
unitOfMeasurePrice: Double,
allowDiscount: Short) extends Product
我只想使用模式匹配从这个列表中提取一个属性。我可以这样做:
{
case Item(_, _, _, _, _, _, _, _, _, _, _, price, _, _) => price
case _ => 0.0
}
有没有一种更直接的方法可以不用写这个冗长的占位符列表?是的,您可以将自己的“unapply”方法添加到Item companion对象中
object Item {
def unapply(item: Item): Option[Double] = Some(item.itemPrice)
}
有关于提取器的好信息
然后您可以使用这个单参数模式匹配来提取价格
item match {
case Item(price) => ???
}
是的,您可以将自己的“unapply”方法添加到Item companion对象
object Item {
def unapply(item: Item): Option[Double] = Some(item.itemPrice)
}
有关于提取器的好信息
然后您可以使用这个单参数模式匹配来提取价格
item match {
case Item(price) => ???
}
这里的简单解决方案是按类型匹配,而不是使用提取器:
item match {
case i: Item => i.itemPrice
case _ => 0.0
}
如果您的case类有这么多字段,那么这种方法无论如何都比较保守,因为可以保证您不必在每次更改类(添加/删除/重新排序属性)时修补所有模式
很高兴了解定制提取器,但我认为这在这里没有多大意义。您能为每个字段定义一个吗
当然,我假设您首先需要进行模式匹配。换句话说,如果上面的
项
值尚未具有项
类型,则这是有意义的。否则,此模式匹配只能直接执行item.itemPrice
这里的简单解决方案是按类型匹配,而不是使用提取器:
item match {
case i: Item => i.itemPrice
case _ => 0.0
}
如果您的case类有这么多字段,那么这种方法无论如何都比较保守,因为可以保证您不必在每次更改类(添加/删除/重新排序属性)时修补所有模式
很高兴了解定制提取器,但我认为这在这里没有多大意义。您能为每个字段定义一个吗
当然,我假设您首先需要进行模式匹配。换句话说,如果上面的
项
值尚未具有项
类型,则这是有意义的。否则,这种模式匹配只能直接执行item.itemPrice我认为应该将对象item
重命名为类似itemPrice
的名称,因为case类item
已经定义了一个不适用的方法。然后您可以使用case ItemPrice(price)=>…
进行模式匹配。是的,Peter是对的。我认为这可能是允许的,因为这个“unapply”返回一个选项[Double],而默认的“unapply”返回一个选项[Tuple14[…]]。我想这是一种类型擦除,两种方法不允许在同一个源中使用。另一方面将对象定义为ItemPrice可以更好地反映您试图完成的任务,并使代码更容易理解。@JoostdenBoer您不能让重载方法具有相同的名称和参数类型,而这些方法在Scala中的返回类型不同。我认为您应该将对象项
重命名为类似的名称ItemPrice
,因为案例类Item
已经定义了一个unapply方法。然后您可以使用case ItemPrice(price)=>…
进行模式匹配。是的,Peter是对的。我认为这可能是允许的,因为这个“unapply”返回一个选项[Double],而默认的“unapply”返回一个选项[Tuple14[…]]。我想这是一种类型擦除,两种方法不允许在同一个源中使用。另一方面,将对象定义为ItemPrice可以更好地反映您试图完成的任务,并使代码更易于理解。@JoostdenBoer您不能让重载的方法具有相同的名称和参数类型,而这些方法在Scala中的返回类型不同。