繁体   English   中英

在Scala中扩展Function1

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM