如何将变量传递给自定义字符串插值

时间:2013-03-25 07:14:32

标签: scala string-interpolation

在下面的工作表中,我创建了一个自定义字符串插值器。

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
}

我有两个问题:

  1. 如何在变量上使用字符串插值器
  2. 如何向字符串插补器传递或使用其他参数。比方说,我的字符串插补器用于从文件中查找变量,但我想动态指定文件名?

1 个答案:

答案 0 :(得分:5)

  1. 字符串插值转换为在编译时直接调用方法,因此不能在变量
  2. 上使用它
  3. 我不确定我是否理解正确,但您可以尝试隐式参数:

    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")
    
  4. 正如@ didier-dupont建议你可以使用第二个参数列表而不暗示:

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