如何使用 Shapeless 通用提取字段名称?

2024-01-01

给定一个案例类别A我可以使用以下代码片段使用 Shapeless 提取其字段名称:

val fieldNames: List[String] = {
  import shapeless._
  import shapeless.ops.record.Keys

  val gen = LabelledGeneric[A]
  val keys = Keys[gen.Repr].apply
  keys.toList.map(_.name)
}

这一切都很好,但是我如何以更通用的方式实现它,以便我可以方便地将这种技术用于任意类,例如

val fields: List[String] = fieldNames[AnyCaseClass]

是否有图书馆已经为我做到了这一点?


也许是这样的,稍微修改过的版本这个例子 https://gist.github.com/lunaryorn/4b7becbea955ae909af7426d2e2e166c:

import shapeless._
import shapeless.ops.record._
import shapeless.ops.hlist.ToTraversable

trait FieldNames[T] {
  def apply(): List[String]
}

implicit def toNames[T, Repr <: HList, KeysRepr <: HList](
  implicit gen: LabelledGeneric.Aux[T, Repr],
  keys: Keys.Aux[Repr, KeysRepr],
  traversable: ToTraversable.Aux[KeysRepr, List, Symbol]
): FieldNames[T] = new FieldNames[T] {
  def apply() = keys().toList.map(_.name)
}

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

如何使用 Shapeless 通用提取字段名称? 的相关文章

随机推荐

  • 将光标移动到 UITextField 的开头

    有没有办法让光标位于a的开头UITextField 当我显示带有内容的控件时 光标放置在文本的末尾 我想把它移到开头 UITextField符合UITextInput协议 它提供了让您控制所选范围的方法 这在我的测试中有效 void tex
  • Python:将 3D 椭球(扁形/长形)拟合到 3D 点

    亲爱的 stackoverflow 用户 我面临如下问题 我想在 python 脚本中将 3D 椭球体拟合到 3D 数据点 起始数据是一组 x y 和 z 坐标 笛卡尔坐标 我想要得到的是 3D 数据点凸包的最佳拟合椭球定义方程中的 a 和
  • AngularFire httpsCallable Object(...) 不是一个函数

    我想在我的 Ionic 3 应用程序中调用 httpsCallable 函数 我正在尝试遵循这些文档 https firebase google com docs functions callable https firebase goog
  • 在 Java 中实现双缓冲

    我有一个简单的 Java JFrame 画布 我每半秒左右更新一次屏幕上的内容 并且有闪烁 我想实现双缓冲来消除闪烁 但我对 Java 相当陌生 不熟悉如何做到这一点 我找到了一些例子 但不确定如何将他们的方法应用到我的方法中 以下是我现在
  • 删除 MS Excel 中特定字符左侧的所有文本

    这是一个与excel相关的问题 我想删除字符串中特定字符或多个字符左侧的所有文本 所有字符 例如 假设我的单元格中有一个字符串大家好 欢迎来到 stackoverflow 现在我想删除 堆栈 左侧的所有字符 意味着结果应该是堆栈溢出 仅限堆
  • WindowsBase.dll 中发生了“System.ComponentModel.Win32Exception”类型的第一次机会异常

    我有一个 NET 4 0 WPF 项目 当我打开文件对话框时 选择一些文件并按 确定 按钮 然后我在输出窗口中看到以下错误 WindowsBase dll 中发生了 System ComponentModel Win32Exception
  • Plotly r,按变量划分的线型

    我正在尝试制作一个散点图 其中线条样式由因子变量指定 就像颜色一样 但我无法让它工作 library plotly df lt data frame x rnorm 20 y rnorm 20 col c rep 1 10 rep 2 10
  • 将补充 Unicode 字符映射到 BMP(如果可能)

    我遇到了这样的问题 我的 XML 解析器 VTD XML 似乎无法处理 Unicode 补充字符 如果我在这里已经错了 请更正 看起来 解析器只使用这些字符的低 16 位 我无法切换到我正在处理的项目中的另一个解析器 我正在解析 Medli
  • 图书馆的异常处理策略

    构建 NET 库时 您的异常处理策略是什么 具体来说 您关于处理库调用内的异常并将其暴露给调用代码的政策是什么 例如 您是否会像对待其他函数一样对待库函数 从而让它无法处理的所有异常按原样流出 您会为该库创建自定义异常吗 您会捕获所有异常并
  • Fixtures、Selenium 和 Rails(天哪?)

    Rails 应用程序上的 Selenium 测试使用哪些数据 你从固定装置加载吗 使用现有的开发数据库 使用单独的 非固定装置 数据库 我正在考虑我的选择 我有一个 Rails 应用程序 其中包含一个大型 Selenium 测试套件 该套件
  • 使用 jqueryhammer.js 2 和事件委托长按(按住)

    我最近升级到hammer js 2 我注意到的第一件事就是 按住 已被 按下 取代 我的旧代码在事件委托方面工作得很好 但切换到按下似乎只有当我将其放在特定元素上时才有效 注意 我通过jquery插件使用hammer js 锤子 js 1
  • 将组件存储在状态中是个好主意吗?

    将整个 React 组件存储在组件状态或 redux 状态中是一个好习惯吗 是的 它是可选的 因为我们可以在状态中存储字符串并有条件地渲染组件 但在某些情况下 将组件存储在状态中更简单 例如 const components useStat
  • 证书中的“主题”是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 相关链接是这个MSDN 文章 http msdn microsoft com en us library bfsktky3 VS 80 a
  • getaddrinfo addrinfo 结果在堆栈或堆中

    至少我有点困惑 getaddrinfo 调用 更新 指向 addrinfo 结构的指针 当我要在同一范围 该函数 中使用 addrinfo 时一切都很好 但是如果我将该结构复制到另一个结构 通过分配它 会发生什么 请帮助我了解正在进行的基础
  • 在 mongodb 集群上创建第一个管理员用户时出现错误“无法添加用户:管理员未授权执行命令”

    我在谷歌云计算引擎中使用版本 3 4 的 mongoDB Cluster 实际上上周我的数据库受到了黑客的攻击 这就是为什么我考虑使用授权 这样我就可以避免这些类型的攻击 现在要添加授权我看到了这篇文章如何创建 mongodb 复制集群 h
  • 堆栈上的总变量大小是否有限制?

    在编码时 我们是否应该考虑对堆栈上创建的变量的总大小进行一些限制 如果是 我们应该根据什么来决定 它取决于操作系统 内存可用性等吗 是否有任何编译器选项可以检查这一点 任何指向该方向的指示也会有所帮助 这是 C 标准中不太用户友好的领域之一
  • 使用 EF 6 alpha3 Code First 和迁移创建 __MigrationHistory 表部署到 SQL Azure 时出错

    我首先使用 EF 6 alpha 3 代码 当我尝试运行 Update Database 命令在 SQL Azure 上创建数据库时 出现以下错误 此版本的 SQL Server 不支持没有聚集索引的表 请创建聚集索引并重试 我追踪到 Mi
  • 如何在 ASP.NET MVC 中创建友好的 URL?

    如何在 ASP NET MVC 框架中生成友好的 URL 例如 我们有一个如下所示的 URL http site catalogue BrowseByStyleLevel 1 1 是要浏览的学习级别 在本例中为较高级别 的 Id 但我想以与
  • 从 JTable 单元格获取值

    我在 Jtable 中创建了一个可编辑的列 完成单元格编辑后 我想要单元格中的旧值 您可以通过使用来获取该值 table getModel getValueAt row index col index where table是表的名称 它将
  • 如何使用 Shapeless 通用提取字段名称?

    给定一个案例类别A我可以使用以下代码片段使用 Shapeless 提取其字段名称 val fieldNames List String import shapeless import shapeless ops record Keys va