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
我看不出有什么问题。scalaforall
方法遵循的是,它最大限度地减少了意外。对于您的特定示例,您可能应该使用正则表达式“”。匹配(\\d+”
。您可以将For all
与exists
组合使用:
str.exists(_.isDigit) && str.forall(_.isDigit)
// returns true for "123", false for "", false for "1nodigits"
事实上,“”中的每个字符都是一个数字。你的问题到底是什么?同意。我通常这样解释:1)Forall是真的,只要没有元素不符合谓词;2) 只要至少有一个元素满足谓词,Exists就是真的。如果我采用这种方法,我可能会选择Exists
加上非空测试。