在Scala中扩展Function1

时间:2017-11-28 17:25:28

标签: scala

在一些例子中,我看到一个对象或类扩展Function1

E.g。 Hidden features of Scala

中的object Cash extends (CashProduct => String)

(我认为A => B表示Function1

延长Function1的好处是什么?

2 个答案:

答案 0 :(得分:1)

您提供的完整示例:

object Cash extends (CashProduct => String) {
  def apply(p: CashProduct) = p.currency.name + "="

  def unapply(s: String)(implicit ps: ProductService): Option[CashProduct] = {
    if (s.endsWith("=") 
      Some(ps.findCash(s.substring(0,3))) 
    else None
  }
}

表明OP希望获得apply方法的语法优势,允许您创建一个名为Cash(...)的实例。

但为什么你真的想扩展一个功能呢?让我们看一个更好的案例,List[T]

如果我们查找长继承层次结构,我们将看到:

trait Seq[+A] extends PartialFunction[Int, A]  

嗯,为什么Seq会延伸PartialFunction[Int, A](后者继承Function1[A, B]?因为如果我们考虑一下,如果我传递一个List [A]和Int ,表示我正在寻找的元素的索引,它将(不会有效地)返回给定索引处的元素(如果存在)。

答案 1 :(得分:1)

与仅定义Function1相比,扩展apply的好处就是您可以将此对象传递到期望Function1的位置。 E.g。

val products: List[CashProduct] = ...
products.map(Cash)

如果没有extends,则必须将其写为

val products: List[CashProduct] = ...
products.map(Cash(_)) 
// or products.map(Cash.apply)