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

Scala 如何将变量传递给自定义字符串插值器,scala,string-interpolation,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 Strin

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

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
}
对象查找{
隐式类LookupSC(val sc:StringContext)扩展了AnyVal{
def查找(args:Any*):字符串={
val strings=sc.parts.iterator
val表达式=args.iterator
var buf=新的StringBuffer(strings.next)
while(strings.hasNext){
buf append doLookup(expressions.next.toString)
buf append strings.next
}
buf.toString()
}
def doLookup(s:字符串):字符串={
//只需将字符串更改为大写即可进行测试。
s、 图珀案
}
}
val x=“酷”
val testString=“不是$x”
查找“How$x”
//查找测试字符串//
  • 字符串插值在编译时转换为直接方法调用,所以不能在变量上使用它
  • 我不确定我是否正确理解您,但您可以尝试隐式参数:

    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所建议的,您可以使用第二个参数列表,而无需隐含:

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

    它不需要是隐式的(取决于用例,它可能方便也可能不方便)。第二个参数列表可以正常工作。无论如何,查找方法不需要返回字符串,这留下了许多可能的结果。感谢关于第二个参数列表的提示。是的,插值结果可能是任何类,它只是一个示例。