簡體   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