2013-03-21 2 views
-1

나는 문자열이있는 경우 변수 x 어떤 이유로 ""입니다 :스칼라 변수는 진정한 반환

val x = ""

내가 할 : 그것이 true

을 반환 x.forall(_.isDigit)

나는 왜 그것이 사실인지 조금 당황한가? if 조건이 작동하지 않을 때 어려운 방법을 발견했습니다. 는 다음 나는 스칼라 소스 코드를 보러 갔다 :

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 

그래서 명백하게는 "공허 진실"원칙을 잡고, 그리고 카운터 이후 변수 i0로 반환됩니다 내 문자열의 길이가, 그것을 또한 0입니다 결국 0==0이되어 결국 true이됩니다. forall을 수행하기 전에 x.isEmpty을 수행 할 필요가 없습니다.

+0

정확히 어떤 질문입니까? – folone

답변

6

문제가 표시되지 않습니다. scala forall 메서드는 basic first-order logic을 따르므로 놀라움이 최소화됩니다. 귀하의 구체적인 예를 들어 어쨌든 정규 표현식 "".matches("\\d+")을 사용해야합니다.

+0

동의. 나는 이것을 보통 다음과 같이 설명한다. 1) Forall은 어떤 요소도 술어에 실패하지 않는 한 참이다. 2) 존재는 적어도 하나의 요소가 술어를 만족하는 한 참이다. –

0

당신은 existsforall을 결합 할 수 있습니다 : 그것은 모든 문자가 ""숫자입니다 단지 사실

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

만약 내가이 접근법을 택했다면, 아마도'exist'와 비어 있지 않은 테스트를 할 것입니다. –