使用forall()从scala中的选项[String]提取字符串
我不明白forAll什么时候处理无价值的事情使用forall()从scala中的选项[String]提取字符串,scala,forall,Scala,Forall,我不明白forAll什么时候处理无价值的事情 def areTheyEqual(x: Option[String], y: String) = { if (x.forall(_ == y)) { true } else { false } } 当我调用函数时: areTheyEqual(None,“hello”)这返回true,而我认为这是false,因为它们不相等。请帮忙。为什么是这样 编辑: 为了解决这个问题,我将if语句更改为: i
def areTheyEqual(x: Option[String], y: String) = {
if (x.forall(_ == y)) {
true
} else {
false
}
}
当我调用函数时:
areTheyEqual(None,“hello”)
这返回true,而我认为这是false,因为它们不相等。请帮忙。为什么是这样
编辑:
为了解决这个问题,我将if语句更改为:
if(x.nonEmpty&&x.forall(==y))
但是我仍然想知道为什么它在没有
x.nonEmpty
条件的情况下返回true。一般来说,forall
方法检查集合中的所有对象是否满足某个谓词。那么当它返回false
时意味着什么呢?从逻辑上讲,它必须意味着集合中存在谓词不为true的元素。那么None
是否包含谓词不为true的元素?显然不是,因为它根本不包含任何元素。因此,在这种情况下,forall
返回false
是错误的。所以这一切都是有道理的
另一方面,如果
选项
为空,则exists
方法将返回false
。如果您认为Some是一个包含单个元素的列表,而None是一个包含0个元素的列表(它们不是),那么如果(foo)true else false是多余的,那么这可能会有帮助,您只需返回foo
。这就是forall
def看起来的final def forall(p:A=>Boolean):Boolean=isEmpty | p(This.get)
。因此,如果它是空的,这意味着一个None,那么它将返回true,否则将测试谓词。在文档中,`/**如果此选项为空或“”,则返回true。谓词`*$p在应用于此$option的值时返回true。
**这相当于:`*选项匹配{```*case Some(x)=>p(x)`*case None=>true
`*}`*/