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