[英]Extending a Function1 in Scala
在一些例子中,我已经看到一个对象或类扩展了Function1
。
例如, object Cash extends (CashProduct => String)
在Scala的隐藏功能中
(我想A => B
表示Function1
)
扩展Function1
什么好处?
您提供的完整示例:
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]
(它PartialFunction[Int, A]
继承Function1[A, B]
?因为如果我们考虑它,如果我传递一个List [A]一个Int
,表示元素的索引我'在寻找 ,它将(不是有效地)返回给定索引处的元素(如果存在)。
与仅定义apply
相比,扩展Function1
的好处就是您可以将此对象传递给期望Function1
位置。 例如
val products: List[CashProduct] = ...
products.map(Cash)
没有extends
它必须写成
val products: List[CashProduct] = ...
products.map(Cash(_))
// or products.map(Cash.apply)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.