当我有一个字符串变量x
时,由于某种原因,""
:
val x = ""
我这样做:
x.forall(_.isDigit)
它会返回true
我有点困惑为什么它是真的,不应该是假的吗? 当我的if条件不起作用时,我发现了这个问题。 然后我去看Scala源代码:
private def prefixLengthImpl(p: A => Boolean, expectTrue: Boolean): Int = {
var i = 0
while (i < length && p(apply(i)) == expectTrue) i += 1
i
}
override /*IterableLike*/
def forall(p: A => Boolean): Boolean = prefixLengthImpl(p, expectTrue = true) == length
显然,它持有“Vacuous Truth”原则,并且由于计数器变量i
返回为0
且我的字符串长度也为0
,因此它最终成为0==0
因此true
。我发现在执行x.isEmpty
之前不必执行forall
。
答案 0 :(得分:6)
我没有看到问题。 scala forall
方法遵循basic first-order logic,这可以最大限度地减少意外。对于您的具体示例,您可能应该使用正则表达式"".matches("\\d+")
。
答案 1 :(得分:0)
您可以将forall
与exists
合并:
str.exists(_.isDigit) && str.forall(_.isDigit)
// returns true for "123", false for "", false for "1nodigits"
答案 2 :(得分:0)
http://en.wikipedia.org/wiki/Vacuous_truth
这只是一个事实,“”中的每个字符都是一个数字。