4

以下のワークシートでは、カスタム文字列補間を作成しました。

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
}

これに関して2つの質問があります。

  1. 変数で文字列補間をどのように使用しますか
  2. 文字列補間器に追加の引数を渡すか、使用するにはどうすればよいですか。たとえば、私の文字列補間器を使用してファイルから変数を検索するとしますが、ファイル名をその場で指定したいですか?
4

1 に答える 1

6
  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")
    

@ didier-dupontが示唆しているように、暗黙的に2番目のパラメータリストを使用できます。

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))
于 2013-03-25T08:29:16.030 に答える