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

时间:2013-03-21 17:14:02

标签: 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

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

3 个答案:

答案 0 :(得分:6)

我没有看到问题。 scala forall方法遵循basic first-order logic,这可以最大限度地减少意外。对于您的具体示例,您可能应该使用正则表达式"".matches("\\d+")

答案 1 :(得分:0)

您可以将forallexists合并:

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

答案 2 :(得分:0)

http://en.wikipedia.org/wiki/Vacuous_truth

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