복붙노트

[SCALA] 스칼라 2.10에서 문자열 보간 - 어떻게 문자열 변수를 보간하는?

SCALA

스칼라 2.10에서 문자열 보간 - 어떻게 문자열 변수를 보간하는?

문자열 보간 스칼라 스칼라 2.10부터 가능합니다

이것은 기본적인 예입니다

 val name = "World"            //> name  : String = World
 val message = s"Hello $name"  //> message  : String = Hello World

동적 보간을 할 수있는 방법, 예를 들어이 궁금 해서요 다음 (단지 설명을 위해, 컴파일되지 않습니다)

 val name = "World"            //> name  : String = World
 val template = "Hello $name"  //> template  : String = Hello $name
 //just for illustration:
 val message = s(template)     //> doesn't compile (not found: value s)

해결법

  1. ==============================

    1.의 사실 (암시 적 StringContext에서 변환 할 수 있습니다 또는 무언가) StringContext의 방법이다. 때 쓰기

    의 사실 (암시 적 StringContext에서 변환 할 수 있습니다 또는 무언가) StringContext의 방법이다. 때 쓰기

    whatever"Here is text $identifier and more text"
    

    컴파일러로를 desugars

    StringContext("Here is text ", " and more text").whatever(identifier)
    

    기본적으로 StringContext는, 추력, 원시 * 방법을 제공합니다.

    당신이 볼 수 있듯이, 컴파일러 자체가 이름을 선택합니다과 방법을 제공합니다. 이 컴파일시에 발생하기 때문에, 당신은 현명 동적으로 할 수 없어 - 컴파일러는 런타임에 변수 이름에 대한 정보를 가지고 있지 않습니다.

    당신은 당신이 원하는 값을 교환 할 수 있도록하지만, 바르를 사용할 수 있습니다. 이 같은 게임을 재생할 수 있도록 기본의 메소드는 (예상대로) 객체의 toString

    class PrintCounter {
      var i = 0
      override def toString = { val ans = i.toString; i += 1; ans }
    }
    
    val pc = new PrintCounter
    def pr[A](a: A) { println(s"$pc: $a") }
    scala> List("salmon","herring").foreach(pr)
    1: salmon
    2: herring
    

    (이미 0이 예에서 REPL로 불렸다).

    그것은 당신이 할 수있는 최선에 관하여이다.

    * 원료가 끊어지고 2.10.1까지 고정 될 예정되지 않는다; 변수 전에 텍스트 만은 (아무 이스케이프 처리) 실제로 원시입니다. 그래서 2.10.1 아웃 될 때까지 하나를 사용하여 보류 또는 소스 코드를보고 자신을 정의합니다. 기본적으로, 그래서 자신을 정의하는 것은 매우 간단합니다, 탈출 처리가 없다.

  2. ==============================

    2.여기에 원래의 질문의 맥락에서 # 1에 대한 가능한 해결책은 렉스의 훌륭한 답변에 따라입니다

    여기에 원래의 질문의 맥락에서 # 1에 대한 가능한 해결책은 렉스의 훌륭한 답변에 따라입니다

    val name = "World"                  //> name: String = World
    val template = name=>s"Hello $name" //> template: Seq[Any]=>String = <function1>
    val message = template(name)        //> message: String = Hello World
    
  3. ==============================

    3.그 ID가 암시 적 클래스를 통해 소개 사용자 정의 보간 될 수 있습니다. 문서는 JSON 보간에 대한 예를 제공합니다

    그 ID가 암시 적 클래스를 통해 소개 사용자 정의 보간 될 수 있습니다. 문서는 JSON 보간에 대한 예를 제공합니다

    implicit class JsonHelper(val sc: StringContext) extends AnyVal {
      def json(args: Any*): JSONObject = {
        ...
      }
    }
    
  4. ==============================

    4.지역 변수의 이름은 실행 시간에 사용할 수 없습니다 - 디버그 기호로 주변에 유지 될 수뿐만 아니라 박탈 된 수 있습니다 : 이것은 현재 구현에서 본질적으로 불가능하다. (멤버 변수의 이름은,하지만 당신이 여기 설명하는지 아니다).

    지역 변수의 이름은 실행 시간에 사용할 수 없습니다 - 디버그 기호로 주변에 유지 될 수뿐만 아니라 박탈 된 수 있습니다 : 이것은 현재 구현에서 본질적으로 불가능하다. (멤버 변수의 이름은,하지만 당신이 여기 설명하는지 아니다).

  5. from https://stackoverflow.com/questions/13260864/string-interpolation-in-scala-2-10-how-to-interpolate-a-string-variable by cc-by-sa and MIT license