Scala编程:综合循序渐进指南,第2版,第546页:
在Iterable下面的继承层次结构中,您会发现三个特征:Seq, 设置和地图。这三个特征的一个共同方面是它们都是 使用apply和isDefinedAt实现PartialFunction特性 方法
但是,此代码无法编译(尝试了2.8.2和2.10.2):
Set(1, 2, 3).isDefinedAt(1)
有错误:
value isDefinedAt is not a member of scala.collection.immutable.Set[Int]
这是书中的错误吗?
答案 0 :(得分:11)
当然看起来像。一直到Scala 2.5.0:
似乎合理:Set
从对象映射到Boolean
值,因此始终定义(成员true
,非成员false
)。
答案 1 :(得分:1)
在数学中,部分函数X => Y
是函数X' → Y
,其中X'是X的一个子集。命名Set a PartialFunction是不正确的,因为它是一个总函数 - 它是在每个元素上定义的。
这就是Set(1, 2, 3).isDefinedAt _
没有意义的原因 - 它始终等于true
如前所述,Set [T]扩展T => Boolean,apply方法导致true或false,元素是否存在。如果需要,可以创建
trait NamedSet[T] extends Set[T] with PartialFunction[T,Boolean] {
def isDefinedAt(x: T) = true
}
如你所见,它没有意义