Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala模式匹配-在case类中绑定单个属性_Scala - Fatal编程技术网

scala模式匹配-在case类中绑定单个属性

scala模式匹配-在case类中绑定单个属性,scala,Scala,我有一个case类,其中包含一长串属性,例如: case class Item(itemCode: ID, itemType: String, itemName: String, manufacturerName: String, manufactureCountry: String, manufacturerItemDescriptio

我有一个case类,其中包含一长串属性,例如:

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中的返回类型不同。