name : String = Wo-6ren">
gpt4 book ai didi

scala - Scala 2.10 中的字符串插值 - 如何插值字符串变量?

转载 作者:行者123 更新时间:2023-12-03 02:25:23 25 4
gpt4 key购买 nike

字符串插值是 available in Scala开始 Scala 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. 有没有办法“动态”评估这样的字符串? (或者它本质上是错误的/不可能的)

  2. s 到底是什么? 它不是一个方法 def ( apparently it is a method on StringContext ),也不是一个对象(如果是的话,它会抛出一个与我认为的 未找到 不同的编译错误)

<小时/>

最佳答案

s 实际上是 StringContext 上的一个方法(或者可以从 StringContext 隐式转换的东西)。当你写的时候

whatever"Here is text $identifier and more text"

编译器将其脱糖为

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

默认情况下,StringContext 为您提供 sfraw* 方法。

正如您所看到的,编译器本身会挑选出名称并将其赋予方法。由于这种情况发生在编译时,因此您无法明智地动态执行此操作 - 编译器在运行时没有有关变量名称的信息。

但是,您可以使用变量,以便可以交换所需的值。默认的 s 方法只调用 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 调用)。

这就是你能做的最好的事情了。

*raw 已损坏,预计要到 2.10.1 才会修复;只有变量之前的文本实际上是原始的(没有转义处理)。因此,在 2.10.1 发布之前不要使用该版本,或者查看源代码并定义您自己的版本。默认情况下,没有转义处理,因此定义您自己的转义处理非常容易。

关于scala - Scala 2.10 中的字符串插值 - 如何插值字符串变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com