IT TIP

Scala 리터럴 식별자 (백틱)에 대한 설명이 필요합니다.

itqueen 2021. 1. 10. 19:44
반응형

Scala 리터럴 식별자 (백틱)에 대한 설명이 필요합니다.


Scala 2nd Ed에서 프로그래밍을 읽고 나는 이것을 발견했습니다.

리터럴 식별자 "이 아이디어는 백틱 사이에 식별자로 런타임에서 허용되는 모든 문자열을 넣을 수 있다는 것입니다."

왜 이것을 사용하는지 완전히 모르겠습니까? 이 책은 Java의 Thread 클래스에서 정적 yield 메소드에 액세스하는 사용 사례를 제공했습니다.

따라서 Scala에서 yield는 예비 단어이기 때문에 yield를 백틱과 함께 사용하면

Thread.`yield`()

Scala의 yield를 무시하고 대신 Java의 Thread 클래스의 메소드 yield에 액세스 할 수 있습니까?

미리 감사드립니다.


바로 그거죠. 백틱을 사용하면 필드 식별자에 이름을 어느 정도 부여 할 수 있습니다. 사실, 당신은 말할 수 있습니다

val ` ` = 0

이름이있는 변수를 정의합니다 (공백의 한 문자).

식별자의 리터럴 정의는 두 가지 경우에 유용합니다. 첫 번째 경우는 Scala에 이미 같은 이름의 예약어가 있고 그것에 대해 신경 쓰지 않는 Java 라이브러리를 사용해야하는 경우입니다 (물론 왜 그래야합니까).

다른 사용 사례는 case문과 함께 제공됩니다 . 규칙은 소문자 이름이 일치 변수를 참조하는 반면 대문자 이름은 외부 범위의 식별자를 참조한다는 것입니다. 그래서,

val A = "a"
val b = "b"
"a" match {
  case b => println("b")
  case A => println("A")
}

인쇄 "b"(컴파일러는 말을 실패하지 못하는 정도 인 경우에 case A연결할 수없는이). 원래 정의 된을 참조 val b하려면 백틱을 마커로 사용해야합니다.

"a" match {
  case `b` => println("b")
  case A => println("A")
}

어느 것이 인쇄 "A"됩니다.

Add 컴파일러가 setter 메서드 (그 자체로 '마법'구문을 사용함)에 대한 코드를 다이제스트하는 데 백틱이 필요한 이 최근 질문 메서드에는 꺾쇠 괄호 (<>) 가있는 더 고급 사용 사례 가 있습니다.


@Debilski에게 감사드립니다. AKKA 문서에서 아래 코드를 이해하는 데 도움이됩니다.

class WatchActor extends Actor {
    val child = context.actorOf(Props.empty, "child")
    ...
    def receive = {
        ...
        case Terminated(`child`) ⇒ ...
    }
}

경우 :

case Terminated(`child`)

Terminated with ActorRef 필드가 이전에 정의 된 자식과 같은 메시지와 일치합니다.

이 진술로 :

case Terminated(c)

모든 Terminated 메시지를 c에 매핑 된 ActorRef 참조와 일치시킵니다 .

참조 URL : https://stackoverflow.com/questions/6576594/need-clarification-on-scala-literal-identifiers-backticks

반응형