2011-03-26 2 views
2

안녕하세요, 다음 코드 스 니펫을 가지고 있습니다.그루비에서 "사용"은 어떻게 작동합니까?

class StringCalci 
{ 
     static def plus(Integer self, Integer Operand) 
     { 
       return self.toInteger() * Operand.toInteger() 
     } 
} 
use (StringCalci) 
{ 
     println("inside the Use method!") 
     println(12 + 3) 
} 
println(12+3) 

groovy에서 Use을 사용하는 것이 충격적이었습니다. 이 것은 내가 런타임에 클래스에 메소드를 추가 할 수 있다는 것이다. (위의 코드를 보면) Groovy가 어떻게 이런 일을 가능하게 할까 생각하고 있었다. Use 안에 println을 사용하면 두 개의 주어진 숫자가 곱 해집니다 (plus 메서드를 재정의했기 때문에). println을 추가하면! 제 질문은 Groovy가 을 Use 외부에서 Useprintln에서 실행하는 방법을 인식하는 방법입니다. Use은 /는 어떤 방법인가요? 이 프로세스의 배경을 이해해야합니다. 제발 알려주세요. :) 감사의 말 :

+0

Groovy를 모르지만 모양에서 보았을 때 'println'은 터치되지 않았습니다.'+'만 오버로드됩니다. – delnan

+0

@Delnam : 예. 플러스가 오버로드되었습니다.하지만 '사용'하면 어떻게 가능했는지 알고 싶습니다. –

+0

설명서를 읽는 것이 고려 되었습니까? –

답변

5

모든 것이 가능하고 아무 것도 확실하지 않은 멋진 언어 세계에 오신 것을 환영합니다!

이 기능을 Categories이라고합니다.

  • use

    사실이 아닌 키워드에 있지만 방법되는 모든 곳에서 사용할 수 있도록 멋져요 런타임 adds to the Object class : 구현에 관해서.
  • 나는 기능은 자바 독으로 판단 클래스 GroovyCategorySupport
  • 에서 주로 구현되는 생각, 그것은 다음 모든 메소드 호출에 대해 상담하는 ThreadLocal에서 오버라이드 (override) 방법의지도를 유지하는 기반으로.
  • 그래, 성능에별로 좋지는 않지만 그루비와 유사한 언어가 제공하는 역동적 인 "마법"기능은 거의 비슷합니다.
+0

@Micheal : 답장을 보내 주셔서 감사합니다 :) ^^ 답변은'ThreadLocal'에 있습니다. 이제 이것에 대해 자세히 알아 보겠습니다. :) –

+0

@Micheal : 답변에서'ThreadLocal'은 java에 있습니다. static 클래스는 각 스레드가 ** 숫자 **를 가짐), Groovy는 그것을 활용하여'Use'를 구현합니다. 맞습니까? –

+0

@Aussies : 그 말이 맞다. 그러나 실제로 GroovyCategorySupport의 javadoc이 "로컬 스레드 컨텍스트"를 언급한다는 사실을 기반으로 어떻게 구현 될지 짐작할뿐입니다. 안녕하세요 –