수색…


비고

Groovy는 if , whilefor에서 Java가 표준 Java 조건과 동일한 방식으로 조건을 평가합니다. Java에서는 부울 식 (부울로 평가되는 식)을 제공해야하며 결과는 평가의 결과입니다.

Groovy에서 결과는 Java의 경우와 동일합니다 (제공된 예제가 없으며 표준 Java입니다).

예제에 표시된 다른 진실성 평가 메커니즘 은 다음과 같이 요약 할 수 있습니다.

  • numbers : 0 값은 false, 0이 아닌 true로 평가됩니다.
  • 객체 : null 객체 참조는 false를, null 이외는 true를 참조합니다.
  • 문자 : 값이 0 인 문자는 거짓으로 평가되고 그렇지 않으면 true로 평가됩니다.
  • 문자열 : null이 아니고 비어 있지 않으면 문자열이 true로 평가되고, null 또는 비어 있으면 false가됩니다 (GStrings 및 CharSequences에도 적용됨).
  • Collections 및 Maps ( List , Map , Set , HashSet ... 하위 클래스 포함) : 또한 크기를 고려하고 콜렉션이 null이 아니고 비어 있지 않으면 true로 평가하고 null 또는 비어 있으면 false로 평가합니다.
  • 열거 형 및 반복자는 null이 아니고 더 많은 요소 (true는 그루비가 객체에 hasMoreElements 또는 hasNext 를 평가 함)이면 true로, null 또는 더 이상 요소가 없으면 false로 평가됩니다.
  • Matcher : 일치하는 사람이 하나라도 있으면 true, 일치하지 않는 경우 false.
  • 종결 : 종결은 종결에 의해 반환 된 결과의 평가로 평가됩니다.

asBoolean 메소드는 사용자 정의 클래스에서 재정 의하여 사용자 정의 부울 평가를 제공 할 수 있습니다.

숫자 부울 평가

숫자의 경우 0 값은 false, 0이 아닌 값은 true로 평가됩니다.

    int i = 0
...
    if (i)
        print "some ${i}"
    else
        print "nothing"

"아무것도"인쇄하지 않습니다.

문자열 부울 평가

문자열 (GString 포함)은 null이 아니고 비어 있지 않은 경우 true로 평가되고 null 또는 비어 있으면 false로 평가됩니다.

def s = ''
...
if (s) 
    println 's is not empty'
else
    println 's is empty'

인쇄 할 것입니다 : 's is empty'

콜렉션 및 맵 부울 평가

컬렉션 및 맵은 null이 아니고 비어 있지 않은 경우 true로, null 또는 비어 있으면 false로 평가됩니다.

/* an empty map example*/
def userInfo = [:]
if (!userInfo)
    userInfo << ['user': 'Groot', 'species' : 'unknown' ]

user: 'Groot' , species : 'unknown' userInfo 맵이 비어 있기 때문에 기본 userInfo로 user: 'Groot' , species : 'unknown' 을 추가합니다 (맵은 null이 아닙니다)

null 객체를 사용하면 코드가 가볍게 다르기 때문에 userInfo가 null이므로 <<을 호출 할 수 없습니다. 할당을해야합니다 (Object 부울 평가 참조).

/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
    userInfo = ['user': 'Groot', 'species' : 'unknown' ]

그리고 null Map :

/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
    userInfo = ['user': 'Groot', 'species' : 'unknown' ]

객체 불리언 값 평가

null 객체 참조는 true, null 이외의 참조를 false로 평가하지만 문자열, 컬렉션, 반복기 및 열거 형의 경우에도 크기를 고려합니다.

def m = null

if (!m)
    println "empty"
else
    println "${m}"

"빈"

def m = [:]

if (!m)
    println "empty"
else
    println "${m}"

맵은 null는 아니고 비어 있습니다.이 코드는 "empty"를 인쇄합니다.

한 후에

m << ['user' : 'Groot' ]

지도를 인쇄합니다.

[user:Groot]

사용자 정의 클래스에서 부울 평가 무시

때때로 어떤 종류의 객체를 위해 자신의 프로그램에 특정 asBoolean 정의를 갖는 것이 유용 할 수 있습니다.

/** an oversimplified robot controller */
class RunController {
    
    def complexCondition
    int position = 0
    
    def asBoolean() {
        return complexCondition(this);
    }
    def advanceTo(step) {
        position += step
    }
}
def runController = new RunController(complexCondition : { c -> c.position < 10 } )

assert runController
runController.advanceTo(5)
assert runController
runController.advanceTo(5)
// The limit has been reached : the controller evaluates to false
assert !runController

이 코드는 로봇의 위치가 10을 초과하지 않는지 점검하는 과도하게 단순화 된 로봇 컨트롤러를 보여줍니다 (조건 평가를위한 클로저 포함)

문자 평가

Character는 값이 0이 아닌 경우 true로, 0 인 경우 false로 평가됩니다.

assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert  new Character('Hello'.charAt(0))

일치 평가

Matcher는 적어도 하나의 일치 항목을 찾을 수 있으면 true로, 일치하는 항목이 없으면 false로 평가합니다.

// a match is found => true
assert 'foo' =~ /[a-z]/
// the regexp does not match fully => no match => false
assert !( 'foo' ==~ /[a-z]/ )
// a match is found => true
assert 'foo' =~ /o/
// no match => false
assert !( 'foo' =~ /[A-Z]/ )

폐쇄 평가

종결의 평가는 종결의 결과에 대한 평가입니다.

모든 규칙이 적용됩니다. 클로저가 null, 숫자 0 또는 빈 문자열, 콜렉션, 맵 또는 배열을 반환하면 false로 평가되고 그렇지 않으면 false로 평가됩니다.

// Closure return non zero number => true
assert { 42 }()
// closure returns 0 => false
assert ! ( { 0 }())
// closure returns null => false
assert !( { }())


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow