2013-03-21 30 views
-1

當我有一個字符串變量x,由於某種原因是""與空字符串斯卡拉變量返回true

val x = ""

,我做的事: x.forall(_.isDigit)返回true

我有點困惑,爲什麼它是真的,它不應該是假的? 當我的條件不起作用時,我發現了這個難題。 後來我去看了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和我的字符串的長度也0,它結果是0==0因此true。我發現在執行forall之前不應該有必要執行x.isEmpty

+0

你的問題到底是什麼? – folone 2013-03-21 17:17:26

回答

6

我沒有看到問題。斯卡拉forall方法遵循basic first-order logic,最大限度地減少驚喜。對於你的具體例子,你應該使用正則表達式"".matches("\\d+")

+0

同意。我通常將其解釋爲:1)只要沒有元素使謂詞失敗,Forall就是真實的; 2)只要至少有一個元素滿足謂詞,存在就是真實的。 – 2013-03-21 17:57:55

0

您可以用exists結合forall

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

如果我正在採取這種方法,我可能會去'存在'加一個非空測試。 – 2013-03-21 17:59:06