2013-03-16 2 views
3

내가 나를 유형 Token을 정의하기 위해 강제로 Scanners에서 확장하는 클래스를 작성하고있어 내 토큰 클래스 자체는 Token라고스칼라에서 유형 이름 충돌을 처리하는 방법은 무엇입니까?

object MyScanner extends Scanners { 
    type Token = ... 
} 

문제가된다 : 그것은에

abstract class Token(...) 
case class Literal(...) 
... 

인가 스칼라 어떻게 든 TokenScanners의 유형을 내 Token 클래스로 정의 할 수 있습니까?

type Token = Token 분명히 작동하지 않습니다.

I는 다음과 같이 (main.scala로 시작하는) 전체 패키지 이름을 사용하여 시도 :

type Token = main.scala....Token 

이 난 MyScanner 내부 main 함수를 정의한 바와 같이 다른 이름으로 충돌한다.

내 현재 솔루션은 내 토큰 클래스의 이름을 바꾸는 것입니다. 초기 이름을 지킬 수있는 또 다른 곳이 있습니까?

+0

또 다른 해결책은 'MyScanner'의 어휘 '유형'을 'MyScannerType'(또는 이와 비슷한 이름)으로 바꾸는 것입니다. – GoZoner

+1

'import'를 통해 접근하는 이름의 이름을 바꿀 수 있습니다 :'import org.foo.bar. {This => That}'는'org.foo.bar.This'를 가져 오되'That'로 이름을 변경합니다. 또한 이름을 버리고 와일드 카드 가져 오기에서 효과적으로 제외시킬 수 있습니다 :'import org.foo.bar. {Florp => _, _}'. 이것은'org.foob.bar' _except_'Florp'에서 모든 심볼을 임포트합니다. –

+0

이것은 중요한 질문이므로 질문 해 주셔서 감사합니다. 그러나 [Scala 명명 규칙] (http://docs.scala-lang.org/style/naming-conventions. html)을 사용하면 com.foo.main이라는 패키지를 참조 할 수 있습니다. 단순한 클래스 이름은 좋은 생각이지만, 패키지 이름은 조직 내에서 다른 조직이나 다른 프로젝트가 동일한 완전한 이름을 사용하지 않도록 충분히 고유해야합니다. –

답변

6

정규화 된 클래스 이름을 사용하여 토큰 유형을 정의하면 작동합니다. 주 방법과 이름 충돌을 피하려면 루트 접두사를 사용하여 상대 유형 이름이나 메소드 이름이 아닌 완전한 유형의 이름을 나타낼 수 있음을 나타낼 수 있습니다. 예를 들어 :

package main 

import scala.util.parsing.combinator.lexical._ 

case class Token(s: String) 

object MyScanner extends Scanners { 
    type Token = _root_.main.Token 
    val Token = _root_.main.Token 
    def errorToken(msg: String) = Token(msg) 
    def token = ??? 
    def whitespace = ??? 

    def main = ??? 
} 

일부 다른 대안은 다음과 같습니다 :

  1. 은 (바깥 쪽 개체 또는 패키지 개체 중 하나)을 MyScanner 객체의 외부 형태 별칭을 정의.
  2. 토큰 클래스 가져 오기 및 가져 오기의 일부로 별칭 지정. 예 : import main.scala.{Token => MyToken}.
+0

'_root_'에 대해 알지 못했습니다. 아마 대체 번호 2를 쓸거야. 고마워. – r0estir0bbe

관련 문제