Groovy : "def x = 0"에서 "def"의 목적은 무엇입니까?



Answers

Ted의 답변 은 스크립트에 탁월합니다. Ben의 답변 은 수업에 표준입니다.

Ben이 말했듯이, 그것을 "Object"라고 생각합니다. 그러나 Object 메소드로 제한하지 않는다는 점에서 훨씬 더 차갑습니다. 이것은 수입과 관련하여 깔끔한 함의를 가지고있다.

예 :이 스 니펫에서는 FileChannel을 가져와야합니다.

// Groovy imports java.io.* and java.util.* automatically
// but not java.nio.*

import java.nio.channels.*

class Foo {
    public void bar() {
        FileChannel channel = new FileInputStream('Test.groovy').getChannel()
        println channel.toString()
    }
}

new Foo().bar()

예. 그러나 여기에서는 모든 것이 클래스 패스에있는 한 '날개 달기'만 할 수 있습니다.

// Groovy imports java.io.* and java.util.* automatically
// but not java.nio.*
class Foo {
    public void bar() {
        def channel = new FileInputStream('Test.groovy').getChannel()
        println channel.toString()
    }
}

new Foo().bar()
Question

다음 코드에서 ( Groovy Semantics Manual 페이지 에서 가져온) 왜 할당 키워드 앞에 def 십니까?

def x = 0
def y = 5

while ( y-- > 0 ) {
    println "" + x + " " + y
    x++
}

assert x == 5

def 키워드는 제거 될 수 def 스 니펫은 동일한 결과를 생성합니다. 키워드 def효과 는 무엇입니까?




사실, 나는 똑같은 행동을한다고 생각 하지 않는다 .

Groovy의 변수에는 여전히 TYPED 선언이 아닌 선언이 필요합니다. 일반적으로 오른쪽에는 Groovy가 변수를 입력하기에 충분한 정보가 들어 있기 때문입니다.

def 또는 형식으로 선언하지 않은 변수를 사용하려고하면 코드가 포함 된 클래스의 멤버를 사용하고 있다고 가정하므로 "해당 속성 없음"오류가 발생합니다.




이 단일 스크립트에 관한 한 실용적인 차이점은 없습니다.

그러나 키워드 "def"를 사용하여 정의 된 변수는 로컬 변수, 즉이 스크립트의 로컬 변수로 처리됩니다. 앞의 "def"가없는 변수는 처음 사용할 때 바인딩 (binding)에 저장됩니다. 바인딩을 "스크립트"사이에서 사용할 수 있어야하는 변수 및 클로저의 일반 저장 영역으로 생각할 수 있습니다.

따라서 두 개의 스크립트가 있고 같은 GroovyShell로 실행하면 두 번째 스크립트는 첫 번째 스크립트에서 "def"없이 설정 한 모든 변수를 가져올 수 있습니다.




Related



Tags

groovy