Scala变量,空字符串,检查是否全部为数字时返回true

Scala变量,空字符串,检查是否全部为数字时返回true,scala,Scala,当我有一个字符串变量x由于某种原因是”: val x=”“ 我确实: x.forall(u.isDigit)它返回true 我有点困惑为什么它是真的,它不应该是假的吗? 当我的if条件不起作用时,我以艰难的方式发现了这一点。 然后我去看了Scala源代码: private def prefixLengthImpl(p: A => Boolean, expectTrue: Boolean): Int = { var i = 0 while (i < length &am

当我有一个字符串变量
x
由于某种原因是

val x=”“

我确实:
x.forall(u.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
private def prefixlenghtimpl(p:A=>Boolean,expectTrue:Boolean):Int={
变量i=0
而(iBoolean):Boolean=prefixLengthImpl(p,expectTrue=true)=长度

显然,它持有“真空真值”原则,由于计数器变量
i
返回为
0
,并且字符串的长度也是
0
,因此它最终是
0==0
,因此
true
。我发现在对所有执行
之前,不必执行
x.isEmpty

我看不出有什么问题。scala
forall
方法遵循的是,它最大限度地减少了意外。对于您的特定示例,您可能应该使用正则表达式
“”。匹配(\\d+”

您可以将
For all
exists
组合使用:

str.exists(_.isDigit) && str.forall(_.isDigit)
// returns true for "123", false for "", false for "1nodigits"


事实上,“”中的每个字符都是一个数字。

你的问题到底是什么?同意。我通常这样解释:1)Forall是真的,只要没有元素不符合谓词;2) 只要至少有一个元素满足谓词,Exists就是真的。如果我采用这种方法,我可能会选择
Exists
加上非空测试。