【问题标题】:Scala interpolate String from variableScala从变量中插入字符串
【发布时间】:2018-06-02 08:47:23
【问题描述】:

字符串插值在这种情况下可以正常工作:

val name = "Bill"
val result = s"My Name is ${name}"

当我将它引入变量时,它没有得到内插值:

val name = "Bill"
val greeting = "My Name is ${name}"
val result = s"${greeting}"

greeting 的直接包装不是合适的解决方案,我必须像普通字符串一样处理问候语。

【问题讨论】:

  • 插值 greeting 没有意义,因为它已经是一个字符串
  • @pacman 有什么问题?
  • 你想要一个函数(name: String) => s"My Name is ${name}"吗?或者您是否希望 name 在您调用 s"${greeting}" 时动态绑定到名为 name 的任何变量?提示:无论哪种方式都可以使用该功能。它远不那么令人困惑。
  • 人们所说的他们想要的东西、人们真正想要的东西和人们需要的东西之间往往存在差异。
  • 我认为这是一个结构良好的问题。很明显result 的预期是什么,不关心greeting 的类型是可以的,就像用户不关心s"$greeting" 的实际作用一样。

标签: scala string-interpolation


【解决方案1】:

Scala 中的字符串插值并不像您期望的那样组成。

这个has been debated 的问题。人们想要它,但人们并不总是得到他们想要的。

您可以想象编写一些协同工作的宏。一个定义了一个接受字符串的函数,另一个知道如何通过在范围内使用正确命名的值调用它来插入它。

另外值得补充的是,插值不是通用的运行时模板机制。例如,您不能从 "$greeting" 形式的文件中读取字符串并对其运行插值替换。

【讨论】:

    【解决方案2】:
    • 有一个未使用的变量name,其值为"Bill"
    • 有一个String变量greeting包含字符['M','y',' ','n','a','m','e',' ','i','s',' ','$','{','n','a','m','e','}'](与变量name完全无关,'n''a''m''e'这四个字符是不可能的接近编译器的符号表,这很好)。
    • 有一个变量result,其值是通过greeting 的字符串插值计算得出的。自从

      val y = "whatever"
      val x = s"${y}"
      

      必须始终导致变量x与变量y具有相同的内容,变量result最终具有与greeting相同的值,即"My Name is ${name}"

    如果编译器试图执行每个看起来有点像 Scala 代码的子字符串,这将导致完全混乱,因为每次有东西可以从String-data 的领域泄漏到可执行代码的领域,它会使代码易受各种注入攻击。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2014-10-03
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多