在一些例子中,我看到一个对象或类扩展Function1
。
object Cash extends (CashProduct => String)
(我认为A => B
表示Function1
)
延长Function1
的好处是什么?
答案 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)