2013-03-25 1 views
3

아래 워크 시트에서 사용자 정의 문자열 보간을 작성했습니다. 당신은 당신이 통과 또는 문자열 보간에 대한 추가 인수를 사용하려면 어떻게 변수 어떻게 변수를 사용자 정의 문자열 보간기에 전달합니까?

  • 에 문자열 보간을 어떻게 사용합니까

    1. :

      object WSLookup { 
      
          implicit class LookupSC(val sc: StringContext) extends AnyVal { 
          def lookup(args: Any*): String = { 
           val strings = sc.parts.iterator 
           val expressions = args.iterator 
           var buf = new StringBuffer(strings.next) 
      
           while (strings.hasNext) { 
           buf append doLookup(expressions.next.toString) 
           buf append strings.next 
           } 
           buf.toString() 
          } 
      
          def doLookup(s: String): String = { 
           // Just change the string to uppercase to test. 
           s.toUpperCase 
          } 
          } 
      
          val x = "cool" 
          val testString = "Not $x" 
          lookup"How $x" 
      
          // lookup testString //<--- See question 1 
      } 
      

      나는이에 대한 두 가지 질문이 있습니다. 예를 들어 내 문자열 보간 기가 파일에서 변수를 찾는 데 사용되지만 파일 이름을 즉시 지정하고 싶다고합시다.

  • 답변

    5
    1. 문자열 보간은 컴파일 타임에 직접 메서드 호출로 변환, 그래서 내가 제대로을 이해하지 확신
    2. 당신이 변수를 사용할 수 없지만 암시 적 매개 변수를 시도 할 수 있습니다 :

      : @의 디디에 - 듀폰 등

      implicit class TestInt(val sc: StringContext) extends AnyVal { 
          def test(args: Any*)(implicit prefix: String): String = 
           prefix + sc.s(args:_*) 
      } 
      
      implicit val p = "> " 
      val x = 1 
      println(test"x = $x") 
      

    는 implicits없이 두 번째 매개 변수 목록을 사용할 수 있습니다 제안

    implicit class TestInt(val sc: StringContext) extends AnyVal { 
        def test(args: Any*)(prefix: String): String = 
         prefix + sc.s(args:_*) 
    } 
    val p = "> " 
    val x = 1 
    println(test"x = $x"(p)) 
    
    +1

    암시적일 필요는 없습니다 (유스 케이스에 따라 편리 할 수도 있고 그렇지 않을 수도 있습니다). 두 번째 매개 변수 목록이 작동합니다. 어쨌든 lookup 메서드는 문자열을 반환 할 필요가 없으므로 많은 가능성이 열려 있습니다. –

    +0

    두 번째 매개 변수 목록에 대한 도움말을 보내 주셔서 감사합니다. 예, 보간 결과는 모든 클래스 일 수 있습니다. 단지 샘플 일뿐입니다. –