2010-02-08 1 views
11

혼합 된 인스턴스를 참조하거나 혼합 된 인스턴스를 제한하기 위해 self 또는 this을 사용할 수 있습니다. 예를 들면, 그것들은 동등한가?자신을 수행하십시오 : T => 및 다음과 같습니다 : T => 특성을 정의 할 때 동일한 의미입니까?

scala> trait A { self: List[_] => } 
defined trait A 

scala> trait B { this: List[_] => } 
defined trait B 

이것은 단지 규칙인가 아니면 this과 다른 것을 사용하면 몇 가지 이점이 있습니까?

답변

18

이 아닌 다른 이름을 사용하여 당신이 둘러싸는 인스턴스를 참조 회원 유형이 여기서 "이"유용 할 수 있습니다. 예를 들어,

trait Outer { self => 
    trait Inner { 
    def outer = self 
    } 
} 

일부 상황

trait Outer { 
    trait Inner { 
    def outer = Outer.this 
    } 
} 

, 바람직하다.

6

자기, this, meep, blah 등이 될 수 있습니다. 어떤 클래스를 캐스팅할지 결정할 때 컴파일러에서만 사용되며 (메서드를 호출 할 때) 실제로 바이트 코드에 나타나지 않습니다. 이름을 지정할 때 지역 식별자가 자기 유형 정의보다 우선하기 때문

테이크 케어 :

trait A { 
    def baz = println("baz!") 
} 
trait B { 
    foo: A => 
    val foo = "hello" 
    // def bar = foo.baz // does not compile because foo is String, not A 
    def bar = foo.substring(1) 
} 
관련 문제