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


134

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

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

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

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

답변:


181

세 가지 형식 모두 유효하며 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. 자체 유형 만 설정합니다.


내가 자기 유형을 보는 방식은 특성이 특정 유형을 취하고 foo : B => {...}와 같은 코드 블록을 반환하는 것으로 자신을 선언하는 것입니다. 이제 그 컬은 물론 생략됩니다. 코드의 범위 내에서 "this"대신 객체 이름을 사용할 수 있다는 것이 흥미 롭습니다. [자바 스크립트에서 항상하는
Ustaman Sangat

4
@Martin Odersky 두 개 이상의 특성에 대한 제한을 추가 할 수 trait A { self: B, C => ... }있습니까?
Dmitry Bespalov

13
@DmitryBespalov : 예, with자체 입력 주석에 키워드를 사용할 수 있습니다 . 예를 들어trait A { self: B with C => ... }
Dave

BTW 당신은 또한 할 수있는 _: B =>편의를 위해 비 별칭 경우에
쿠 레오스

17

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.