Scala 变量字符串插值而不是文字

2023-12-23

首先道歉,作为 Scala 的初学者,我找不到更好的措辞来回答这个问题。

我有一个属性文件,需要在其中定义一些参数化命令(或 sql 查询)。以下是一个示例:

[section abc]
stage: StageA
query: Select count(*) FROM tableA WHERE account_id=${account_id} AND dt=$dt AND source=$source

[section def]
stage: StageB
query: Select count(*) FROM tableB WHERE event_date=${event_date} AND template=$template

在我的代码中,我有一个配置对象(考虑一个映射),它具有查询字符串中变量的值(account_id, source, dt, event_date, template, ETC。,)。阅读属性文件后,我需要替换查询字符串中的所有宏。为此,我想编写一个具有如下签名的函数:

def resolve_query(query: String, config: Map[String, Any]): String

它应该返回查询文本,其中宏替换为配置中的值。我尝试编写自己的字符串插值器,但它不起作用。还有什么我可以尝试的吗?


通过字符串插值,编译器将String在将它们发送到重新组合之前将其文字化StringContext。编译器不会对变量中的字符串值执行此操作,因此您必须自己进行切割。

def resolve_query(query: String, config: Map[String, Any]): String =
  "(.*)\\$\\{([^}]+)}(.*)".r
    .findFirstMatchIn(query)
    .fold(query){ m =>
      resolve_query(StringContext(m.group(1)
                                 ,m.group(3)
                                 ).s(config.getOrElse(m.group(2), "unknown")
                                    )
                   ,config
                   )
                }

testing:

resolve_query(
  "Select count(*) FROM tableA WHERE account_id=${account_id} AND source=${source}"
 ,Map("account_id" -> 47, "source" -> "UK")
             )
//res0: String = Select count(*) FROM tableA WHERE account_id=47 AND source=UK

你会注意到我只实现了更简单的${braces}定界形式。这$dollar分隔形式并不复杂,但允许两者(任一/或)将比我现在愿意投入的工作更多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 变量字符串插值而不是文字 的相关文章

随机推荐

  • Google Calendar API - 只能更新事件一次

    我遇到了与这篇文章中描述的相同的问题 Google Calendar api v3 重新更新问题 https stackoverflow com questions 8574088 google calendar api v3 re upd
  • 将私有方法公开以对其进行单元测试...好主意吗?

    Moderator Note There are already 39 answers posted here some have been deleted Before you post your answer consider whet
  • Rstudio 的“在文件中查找”有 R 版本吗?

    我喜欢 Rstudio 的 在文件中查找 功能 您可以在指定目录中的所有文件中搜索文本 但我讨厌指定要搜索的目录和文件类型的方式 您必须单击并指向 呃 有谁知道在 R 控制台中执行此操作的简单方法 fif lt function what
  • Blazor 中的 SendGrid 电子邮件服务 - 依赖注入或静态方法

    我正在 Blazor 应用程序 NET 5 中设置 SendGrid 电子邮件发送器 根据 SendGrid 文档和示例 他们正在编写一个签名为的方法static async Task然后他们await来自他们的 API 的响应 他们的示例
  • 正则表达式在 vb6 中的用法

    我需要验证一个字符串 该字符串可能包含字母数字以及特殊字符 因为我必须传递仅包含字母字符的字符串 不允许使用数字或任何其他特殊字符 在当前的方法中 我使用 ASCII 数字来评估每个字符是否为字母 是否有其他有效的方法来发现字符串中是否存在
  • Google 地图显示空白地图

    I am currently stuck with this problem Google Maps seems not to be loading at all Please see the image below 这真让我抓狂 我已经完
  • 在python3.6上导入yarl或discord.py时出现问题

    由于列出的错误 我最近更新了discord py在这篇文章中 https stackoverflow com questions 63027848 discord py glitch or random error typeerror ne
  • 如何对齐引导表单中的元素

    请 看看我的代码 http www bootply com VcVDblSFK7 http www bootply com VcVDblSFK7 我希望将键符号和输入控件的范围放在同一行中 后 面是错误消息的范围 但我已经做了太多的编辑 并
  • 在c/c++中通过内存中的地址调用函数

    已知函数的原型及其在内存中的地址 是否可以从另一个进程或除了原型和内存地址之外一无所知的一段代码中调用该函数 如果可能的话 如何在代码中处理返回的类型 在现代操作系统上 每个进程有自己的地址空间并且地址仅在进程内有效 如果您想在其他进程中执
  • PowerManager.PARTIAL_WAKE_LOCK android

    我很困惑是否要获取这个唤醒锁 例如 我有这种类型的代码 是从onReceive of a BroadcastReceiever CONNECTIVITY CHANGE BOOT COMPLETED 等 异步地即我正在启动一个IntentSe
  • 如何读取 .lbl 文件

    我想读我的 lbl文件并将其数据存储到数据库列中 因此 每当用户想要修改它时 他们可以创建一个新的 lbl来自数据库的文件 我已经转换了我的 lbl使用下面所示的代码片段将数据转换为二进制 byte fileBytes File ReadA
  • 使用mock模拟嵌套属性

    我有一个返回对象的函数调用 r Foo x y where r具有丰富的嵌套属性集 例如 我可以访问r prop a prop b prop c 我想嘲笑Foo 这样特定的叶子属性r被修改 即使得r prop a prop b prop c
  • 使用 libxml2 进行递归 XPath 查询的最有效方法是什么?

    我为 libxml2 编写了一个 C 包装函数 它使我可以轻松地对 XML 文档进行查询 bool XPathQuery const std string doc const std string query XPathResults re
  • 阻止导航控制器影响其他视图控制器

    我有一个应用程序 它使用带有三个视图控制器的导航控制器来进行分步用户设置 因此 第一个视图将是步骤 1 第二个视图将是步骤 2 等等 所有这些都将嵌入到导航控制器中 以便用户能够来回移动 但是 一旦完成此设置并且用户按下 完成 按钮 应用程
  • Android 数据库被其他线程锁定

    我正在处理 android sqLite 数据库 其中我无法将记录插入数据库 在代码中 我在启动应用程序时仅打开数据库一次 并且设置了对我的应用程序类变量的引用 以便我可以从代码的任何部分访问数据库 并且效果很好 问题是 我可以访问数据库
  • 从文件名中提取日期

    我遇到一种情况 我需要从文件名中提取日期 其一般模式是 filename YYYYMMDD fileExtension e g xxx 20100326 xls or x2v 20100326 csv 下面的程序完成了这项工作 Number
  • 获取复选框的多个值

    我如何使用此代码在 codeigniter 中获取多个复选框值
  • 为什么 Python 列表上的 `for` 比 Numpy 数组上的 `for` 更快?

    因此 在没有讲一个很长的故事的情况下 我正在编写一些代码 从二进制文件中读取一些数据 然后使用 for 循环遍历每个点 所以我完成了代码 但它运行得慢得离谱 我从大约 128 个数据通道循环了大约 60 000 个点 这需要一分钟或更长时间
  • 无法使用 SAX 读取某些属性

    我正在尝试使用 SAX 解析该文档
  • Scala 变量字符串插值而不是文字

    首先道歉 作为 Scala 的初学者 我找不到更好的措辞来回答这个问题 我有一个属性文件 需要在其中定义一些参数化命令 或 sql 查询 以下是一个示例 section abc stage StageA query Select count