Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
如何使用默认参数为case类编写scala提取器?_Scala_Case Class_Extractor - Fatal编程技术网

如何使用默认参数为case类编写scala提取器?

如何使用默认参数为case类编写scala提取器?,scala,case-class,extractor,Scala,Case Class,Extractor,我有一个带有默认参数的case类,我想知道如何编写一个unapply方法,以便只提取前两个参数 我希望下面的代码是清楚的 case class Point(x: Double, y: Double, _key: Option[String] = None) { def key: String = _key.getOrElse("") } object Point { def unapply(p: Point) = (p.x, p.y) } // pSeq is Seq[Point]

我有一个带有默认参数的case类,我想知道如何编写一个unapply方法,以便只提取前两个参数

我希望下面的代码是清楚的

case class Point(x: Double, y: Double, _key: Option[String] = None) {
  def key: String = _key.getOrElse("")
}

object Point {
  def unapply(p: Point) = (p.x, p.y)
}

// pSeq is Seq[Point]
pSeq.map { case Point(x,y) => x + y } // This causes a compiler error:
                                      // wrong number of arguments for <none>: 
                                      // (x: Double, y: Double, _key: Option[String])
case类点(x:Double,y:Double,_key:Option[String]=None){
def key:String=_key.getOrElse(“”)
}
目标点{
未应用的def(p:点)=(p.x,p.y)
}
//pSeq为Seq[点]
pSeq.map{case Point(x,y)=>x+y}//这会导致编译器错误:
//以下参数的参数数目错误:
//(x:Double,y:Double,_-key:Option[String])

我不确定这是否是您正在寻找的,但它会提供您描述的API

密封抽象类点(x:Double,y:Double)
case类PointKey(x:Double,y:Double,_key:String)扩展点(x,y)
案例类PointNoKey(x:Double,y:Double)扩展点(x,y)
目标点{
def apply(x:Double,y:Double)=PointNoKey(x,y)
def apply(x:Double,y:Double,_-key:String)=点键(x,y,_-key)
取消应用def(p:点):选项[(双精度,双精度)]=p匹配{
case PointNoKey(x,y)=>Some(x,y)
case PointKey(x,y,)=>Some(x,y)
}
}
我认为在case类中使用通配符是最好的,如果这对您有用的话

pSeq.map{案例点(x,y,)=>x+y}

这很有效!谢谢,我完全忘记了我可以使用通配符。这可能是显而易见的,但你也可以使用case Point(x,y,z)=>x+y//注意,z从来没有被使用过。我更喜欢这里的通配符。