-1

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

どうやらそれは「空虚な真実」の原則を保持しているようで、カウンター変数iが として返され0、文字列の長さも であるため、最終的には00==0なりtrueます。x.isEmptyを実行する前にを実行する必要はないと思いますforall

4

3 に答える 3

6

問題がわかりません。scalaforallメソッドは、驚きを最小限に抑える基本的な一次論理に従います。あなたの特定の例では、"".matches("\\d+")とにかく正規表現を使用する必要があります。

于 2013-03-21T17:21:47.437 に答える
0

forallと組み合わせることができますexists

str.exists(_.isDigit) && str.forall(_.isDigit)
// returns true for "123", false for "", false for "1nodigits"
于 2013-03-21T17:32:18.967 に答える
0

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

"" 内のすべての文字が数字であることは事実です。

于 2013-03-21T18:37:47.013 に答える