假设我有一个int列表。我可以在其上调用lift
函数,并获得另一个类型为T => Option[T]
的函数。
val f0: Int => Option[Int] = List(1, 2).lift
println(f0.apply(0)) // Some(1)
println(f0.apply(1)) // Some(2)
println(f0.apply(2)) // None
但它是如何运作的?为什么我可以将lift
(来自PartialFunction
特征)功能应用于List
?有一些隐含的魔法吗?
答案 0 :(得分:5)
没有"隐含的魔法"。 List[T]
只是PartialFunction[Int, T]
答案 1 :(得分:1)
如上所述,List[T]
是PartialFunction[Int, T]
的子类型。现在List
不是PartialFunction
的直接子类。
它是以Seq
形式扩展PartialFunction
的{{1}}特征。
Seq是像trait Seq[+A] extends PartialFunction[Int, A]
这样的集合继承的特征,后者又为它们提供List
等方法。
我认为这是一个观点问题。
我会看一下,Lift
是一个Seq
,它从Int值到序列的元素类型,其PartialFunction
方法返回isDefinedAt
的间隔从true
到0
。
看here。
同样,对于地图,所有地图都会扩展延伸length
的特征MapLike
。现在PartialFunction
扩展Map[A,B]
。
因此,将Maps视为PartialFunctions,PartialFunction[A,B]
方法为所有定义的isDefinedAt
返回true
。
我正在从工作表中复制样本。我将keys
分配给Map
说明相同。
PartialFunction
看here。