[scala] 자기 유형 주석에서 이것과 자기의 차이점은 무엇입니까?

다양한 스칼라 문헌에서 “this”를 사용하는 자체 유형 주석과 “self”를 사용하는 다른 유형을 볼 수 있습니다.

trait A { this: B => ... }
trait A { self: B => ... }

“this”또는 “self”를 사용하는 것과 실제로 다른 점이 있습니까? 어떤 이름을 사용하는 것이 중요합니까? 이것도 유효합니까?

trait A { foo: B => ... }



답변

세 가지 형식 모두 유효하며 in B의 유형으로 간주되는 효과가 있습니다.thisA

처음 두 변형

trait A { self: B => ... }
trait A { foo: B => ... }

in trait 의 별칭으로 self(각각 foo)을 소개하십시오 . 내부 클래스에서 참조 에 액세스 할 때 유용합니다 . 즉, 그 안에 중첩 된 클래스 에서 특성 의 참조에 액세스 할 때 대신 사용할 수 있습니다. 예:thisAthisselfA.thisthisA

class MyFrame extends JFrame { frame =>
  getContentPane().add( new JButton( "Hide" ) {
    addActionListener( new ActionListener {
      def actionPerformed( e: ActionEvent ) {
        // this.setVisible( false ) --> shadowed by JButton!
        frame.setVisible( false )
      }
    })
  })
}

세 번째 변형

trait A { this: B => ... }

에 대한 별칭을 소개하지 않습니다 this. 자체 유형 만 설정합니다.


답변

this가장 안쪽 템플릿에 의해 정의 된 객체 를 항상 참조 한다는 점에서 차이가 있습니다 .

표현식 this은 템플리트 또는 복합 유형의 명령문 부분에 나타날 수 있습니다. 참조를 둘러싸는 가장 안쪽의 템플릿 또는 복합 유형으로 정의되는 객체를 나타냅니다. 이것이 복합 유형 인 경우 유형 this은 해당 복합 유형입니다. 단순한 이름이 C 인 클래스 또는 오브젝트 정의의 템플리트 인 경우이 유형은 C 유형과 동일합니다 . this. (스칼라 참조 §6.5)

따라서 self-type이라고 부르 foo더라도 여전히 참조 할 수 있습니다 this(물론 내부 템플릿을 사용하지 않는 한 내부 템플릿을 사용하지 않는 한 내부 템플릿을 this제공하지 않는 한) 템플릿 자체 이름은 동일하지만 다른 방법은 아닙니다.


답변