2013-08-01 2 views
4

저는 스칼라를 배우고 오른쪽 연관 unapply 개체를 가지고 놀고 있습니다. 이름이 ':'로 끝나면 올바른 연관성이 있다는 것을 압니다. 그러나 명명 규칙에는 몇 가지 이상한 제한 사항이있는 것으로 보입니다.스칼라 오른쪽 연관 메서드

이 다음은 유효

object cons: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object :_cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

무효

object cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object >>: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

그래서 식별자에 알파 - 숫자 및 기호를 혼합에 대한 몇 가지 불확실성있을 것 같습니다.

기본적으로 저는 'cons'라는 설명적인 이름을 갖고 있고 여전히 올바른 연관성을 갖고 싶습니다. 또한, 나는 운영자가 심미적 인 이유 때문에 대칭 적이기를 바랍니다 :-), 정말 좋아하지 않아요. cons_:
콜론을 사용하지 않고 뭔가를 연관시키는 방법이 있습니까? 또는 이것을 달성하기위한 다른 제안?

:_cons_:

가장 가까운 것 같다,하지만, 식별자로 시작할 수 없습니다 어떤 이유로 ':'와 영숫자

the spec에서

답변

3

(1.1 절)이 세 가지 방법이 있습니다

을 식별자를 형성한다. 먼저, 식별자는 문자 다음에 임의의 시퀀스 문자 및 숫자가 올 수있는 문자로 시작합니다. 이 경우 밑줄 '_'문자 과 문자 및 숫자로 구성된 다른 문자열 또는 연산자 문자가 올 수 있습니다. 둘째, 식별자는 연산자 문자와 임의의 일련의 연산자 문자로 시작될 수 있습니다. 앞의 두 형식은 일반 식별자라고합니다. 마지막으로 식별자는 역 인용 부호 사이의 임의의 문자열로 구성 될 수도 있습니다 (호스트 시스템은 문자열이 식별자에 적합하다는 제한을 부과 할 수 있음). 그런 다음 식별자는 역 인용 부호 자체를 제외한 모든 문자로 으로 구성됩니다.

귀하의 식별자가 :으로 시작하는 경우 연산자가 아닌 문자를 사용할 수 없습니다. 당신 다음 쓸 수 있도록하지만, 주 (아무것도 할 의도하지 않은 의미를-단지 구문을 보여주기 위해) :

scala> class X { def `:cons:`(i: Int) = i } 
defined class X 

scala> val x = new X 
x: X = [email protected] 

scala> 1 `:cons:` x 
res1: Int = 1 

당신이 얻을 수 있도록하는 방법 이름은 여전히 ​​콜론으로 끝 당신이 찾고있는 올바른 연관성.

+0

좋아요! 임의의 식별자를 허용하기 위해 백 틱을 사용하는 것에 대해서는 몰랐습니다. 감사합니다 – ekj

+0

마지막 문자는 역 인용 부호가 아니며 콜론입니다. 따옴표 붙은 식별자의 따옴표 문자는 문자열 리터럴의 따옴표 문자보다 더 이상 식별자의 일부가 아닙니다. –

+0

@ JörgWMittag : 와우, 그건 내 부분에있어 엄청난 오독 이었어. "제외하다"는 바로 거기에있다. 내 방어에서 일찍 여기 있었고 나는 [this] (http://stackoverflow.com/q/17863794/334519)에 대해 아직도 조금 씁쓸했다. 나는 backtick 접근 방식이 작동한다는 나의 놀람을 제거하기 위해 편집했다. –