다양한 스칼라 문헌에서 “this”를 사용하는 자체 유형 주석과 “self”를 사용하는 다른 유형을 볼 수 있습니다.
trait A { this: B => ... }
trait A { self: B => ... }
“this”또는 “self”를 사용하는 것과 실제로 다른 점이 있습니까? 어떤 이름을 사용하는 것이 중요합니까? 이것도 유효합니까?
trait A { foo: B => ... }
답변
세 가지 형식 모두 유효하며 in B
의 유형으로 간주되는 효과가 있습니다.this
A
처음 두 변형
trait A { self: B => ... }
trait A { foo: B => ... }
in trait 의 별칭으로 self
(각각 foo
)을 소개하십시오 . 내부 클래스에서 참조 에 액세스 할 때 유용합니다 . 즉, 그 안에 중첩 된 클래스 에서 특성 의 참조에 액세스 할 때 대신 사용할 수 있습니다. 예:this
A
this
self
A.this
this
A
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
제공하지 않는 한) 템플릿 자체 이름은 동일하지만 다른 방법은 아닙니다.