2014-07-26 2 views
1

다음 클래스의 자체 유형 주석의 목적/의미는 무엇입니까?클래스/특성이없는 베어 자체 유형

첫 번째 예에서 자체 주석은 전혀 사용되지 않습니다. 파생 된 클래스에서 뭔가가 진행되고 있습니까?

abstract class StrippingTruncatingWriter(out: JPrintWriter) 
      extends JPrintWriter(out) 
      with StrippingWriter 
      with TruncatingWriter { 
    self => 

    def clean(str: String): String = truncate(strip(str)) 
    override def write(str: String) = super.write(clean(str)) 
    } 

또 다른 예가 있습니다.이 경우에는 클래스 내에서 자체의 사용법이 있지만, 대신 "this"를 사용하지 않는 이유는 무엇입니까?

class HiveContext(sc: SparkContext) extends SQLContext(sc) { 
    self => 
    // Here is how the self type annotation is used within the class: 

    val hivePlanner = new SparkPlanner with HiveStrategies { 
    val hiveContext = self 

    override val strategies: Seq[Strategy] = Seq(
     CommandStrategy(self), 
     HiveCommandStrategy(self), 
+1

첫 번째 사용법은 리팩터링을 사용한 커밋의 일부이므로 대부분의 감독이 필요합니다. 커밋은 드물게 주석 처리 된 코드를 가지고 있기 때문에 계속 진행되고 있습니다. 아마도 그것은 원래 IMain을위한 믹스 인이었을 것입니다. 그 곳에서 스스로되기 전에 self.out이 필요할 것입니다. https://github.com/scala/scala/commit/7aca20d8d31790569557c87406a74c0c7377de79 –

+0

@ som-snytt 흥미 롭습니다 - 조사 해 주셔서 감사합니다. 저는 실제로 여기에 스칼라 소스 코드를보고 있다는 것을 깨닫지 못했습니다. – javadba

답변

4

처음에는 불필요한 것처럼 보이지만 내부 클래스 또는 객체가 관련되어있을 때 유용 할 수 있습니다. 다음 두 스 니펫을 비교하십시오.

class SomeClassWithPossiblyVeryLongName { 
    class SomeInnerClass { 
    def outerInstance = SomeClassWithPossiblyVeryLongName.this 
    } 
} 

class SomeClassWithPossiblyVeryLongName { self => 
    class SomeInnerClass { 
    def outerInstance = self 
    } 
} 

외부 클래스 또는 객체의 외부 인스턴스를 참조하는 더 편리한 방법으로 사용될 수있는 별칭입니다. 여러 수준의 내부 클래스가있는 경우 더욱 유용합니다.

첫 번째 예 (추상 클래스)의 self 식별자가 중복하고 아무것도하지 않는다 (OP에서 더 예를 대답하기)

편집.

그러나 두 번째 예에서는 원래 제안한 사용법을 정확하게 보여줍니다. 이 코드 :

new SparkPlanner with HiveStrategies { ... } 

익명 내부 클래스를 생성합니다. 따라서 selfthis으로 바꾼 경우 익명의 내부 클래스 인 this은 익명의 내부 클래스 인스턴스를 참조하고 selfHiveContext 인스턴스를 참조하므로 다른 결과가 나타납니다.

+0

흥미 롭습니다. 특정 클래스에서 내부 클래스가 있는지 확인하기 위해 좀 더 자세히 살펴 보겠습니다.보다 일반적으로는 자체 주석이 어떻게 사용되는지 자세히 살펴 보겠습니다. 어떤 경우이든이 대답은 도움이된다. – javadba

+0

OK OP를 특정 용도 및 추가 질문으로 업데이트했습니다. – javadba

+0

방금 ​​다른 것을 찾았습니다. 그리고 수업 내에서 어떤 용도로도 사용되지 않습니다. 그것은 사실 추상입니다. 업데이트 된 OP를 참조하십시오. – javadba