当检查是否所有都是数字时,Scala变量与空字符串返回true

chi*_*rox -1 scala

当我有一个字符串变量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
Run Code Online (Sandbox Code Playgroud)

因此很明显,它的持"空洞的真理"的原则,因为计数器变量i返回为0我的字符串的长度也是0,它最终被0==0因此true.我发现x.isEmpty在做之前没必要做一个forall.

Gar*_*all 6

我没有看到问题.scala forall方法遵循基本的一阶逻辑,最大限度地减少意外.对于您的具体示例,您可能应该正在使用正则表达式"".matches("\\d+").