在scala中如何将一个案例类转换为另一个不受代码更改字段添加影响的案例类?

2024-04-02

case class Cat(color: Int, isFat: Boolean)
case class Kitten(color: Int, isFat: Boolean)

我想从 Cat 构造 Kitten,但希望在不传递所有参数的情况下自动执行此操作(因此,如果我向 Cat / Kitten 添加更多字段,我不需要更改代码)。有没有一种紧凑的方法可以在scala中实现这一点?

val kitten = Cat(1,True).what_to_do_here? // compact & immune to code changes no need to change that line in case of added fields.

你想看看无形的 https://github.com/milessabin/shapeless.

import shapeless._
import shapeless.syntax._


case class Cat(color: Int, isFat: Boolean)
case class Kitten(color: Int, isFat: Boolean)

val kitten = Kitten(2, true)

val genCat = Generic[Cat]
val genKit = Generic[Kitten]

val cat: Cat = genCat.from(genKit.to(kitten))

println(cat)

Shapeless 是一个库通用编程。例如,通用类型类可以转换密封特征和案例类的任何层次结构的实例(例如Cat and Kitten)转换为通用表示(HList 和 Coproducts),然后返回到任何兼容的类层次结构中。之间的通用表示可以以类型安全的方式进行操作。

genKit.to(kitten)需要一个Kitten,并生成一个 HList2 :: true :: HNil。因为这与通用表示兼容Cat无需修改,它可以使用以下方式存储genCat.from.

在这种情况下,Cat and Kitten几乎相同。如果类型的顺序不同,或者 Kitten 有额外的属性怎么办?如果每个属性的名称都很重要怎么办? Shapeless 中有大量有用的东西,可以通过操纵通用表示来轻松解决此类情况。看一眼this https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/labelledgeneric.scala例如,使用 LabelledGeneric(使用带标签的 HList,又名记录)转换某些类型 Book 的情况下,添加一个属性并将其存储到 ExtendedBook 中。所有这些都是类型安全的。

无形的does使用一些宏,但似乎只依赖其中的一小部分。 Shapeless 的用户不需要自己编写任何宏——繁重的工作是由 Scala 强大的类型系统完成的。

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

在scala中如何将一个案例类转换为另一个不受代码更改字段添加影响的案例类? 的相关文章

随机推荐

  • 如何取消numpy seed()的效果?

    我想在程序的第一部分使用 np random seed 并在第二部分取消它 再次 在我的 python 文件的第一部分中 我希望在每次执行时生成相同的随机数 在第二部分中 我希望在每次执行时生成不同的随机数 在第一部分中 使用常量初始化种子
  • Exchange Web 服务附件加载缓慢

    我正在编写一些代码来下载和处理电子邮件的附件 然后处理它们 该代码在某些情况下可以按要求工作 但仍然存在一些重大问题 每当代码将附件加载到本地磁盘上的文件中时 都会花费很长的时间 并且经常会由于下载缓慢而超时 并出现以下异常 A first
  • 意外查询成功

    SELECT COUNT FROM rps2 workflow WHERE workflow added gt TO DATE 01 09 2011 dd mm yyyy AND workflow finished lt TO DATE w
  • 如何将 system.data.SQLite.dll 的引用添加到 Windows Phone 7

    我是 Windows Phone 7 的新手 请帮我解决这个问题 我想在Windows Phone 7中添加SQLite数据库 我下载了system data SQLite dll 来自sourceforge www sqlite org
  • 蓝鸟承诺解析(数据)在客户端代码中未定义

    希亚斯 我有一个简单的应用程序 客户端期望得到一个承诺作为结果 但是在调用resolve 方法时 承诺不断返回未定义的结果 客户端代码 UsersRepo findOneAsync id id then function err resul
  • 为函数想出好的名字时遇到困难

    因此 我经常难以用简洁的名称描述函数 对于重用的功能来说 这通常不是问题 但通常需要将大型流程分解为子功能 这些通常会得到奇怪的名字 例如connectionsToAccessLines or handleWallVisionSplit或类
  • 在 C 预处理器中,“#”字符是否必须位于行的开头? [复制]

    这个问题在这里已经有答案了 我已经用 C 语言编程有一段时间了 在此期间 我了解到将预处理器指令之前的 字符放在第一列是一种常见的约定 Example include
  • 如何在 Foursquare Venues 搜索 API 中使用 CategoryId

    当包含categoryId参数时 我从API查询中得到了意外的结果 例如 当使用以下参数搜索马萨诸塞州波士顿的 The Citizen Public House 时 ll 42 3489027315987 71 096134185791 q
  • random.expovariate 相当于泊松过程

    我在某处读到 python 库函数 random expovariate 产生相当于泊松过程事件的间隔 真的是这样吗 或者我应该对结果施加一些其他功能 严格阅读你的问题 是的 这就是 random expovariate 所做的 expov
  • 什么是热点?

    我刚刚听说过 HotSpot JVM 而不是 Oracle JRockik JVM 什么是热点 这是旧的 Sun JVM 还是其他什么 HotSpot 是附带的 Sun JVM 它支持频繁使用的代码部分的即时编译 出于所有实际目的 它是 S
  • 如何从消息机器人中删除“Powered by ManyChat”页脚

    我正在为消息平台开发一个聊天机器人 但我发现自己对用户文本输入字段的页脚上出现的 ManyChat 感到着迷 我已成为该页面的管理员 并继续从该页面的已连接应用程序列表中删除许多聊天 但页脚仍然存在 也许我必须调用 Messenger 平台
  • 是否可以验证html5中input=file的大小和类型

    我正在读这个http dev w3 org html5 markup input file html http dev w3 org html5 markup input file html 但我只找到了 accept 属性 我试过这个
  • Python:检查对象是否是序列

    在 python 中 有没有一种简单的方法来判断某些东西是否不是序列 我尝试这样做 if x is not sequence但Python不喜欢那样 iter x 将提出一个TypeError if x不能迭代 但该检查 接受 集合和字典
  • 获取我的应用程序的当前 dot net 版本

    如何获取我的 asp net 应用程序的正在运行的 dot net 版本 我尝试了这里的解决方案 有没有一种简单的方法来检查 NET Framework 版本 https stackoverflow com questions 951856
  • 如何解决 HttpURLConnection 上的 NullPointerException?

    我正在开发一个Android应用程序 使用ExoPlayer进行视频播放 使用Glide进行图像显示 使用下载库进行文件下载 它们都有与HttpURLConnection相关的NullPointerException 我确信使用的链接是可用
  • Java中的BlockingQueue是完全线程安全的吗

    我知道文档说该对象是线程安全的 但这是否意味着从所有方法对它的所有访问都是线程安全的 所以如果我打电话put 同时从多个线程上进行操作take 在同一时刻 不会有什么不好的事情发生吗 我问这个问题是因为这个答案让我再次猜测 https st
  • SQL:使用 FOR XML 每个元素一行

    我有一个 SQL Server 2005 查询 它生成一个大结果集 最多几 GB SELECT FROM Product FOR XML PATH Product 运行查询会生成一行 其中包含具有许多产品元素的文档 Row 1
  • 基于角色在GridView中显示编辑按钮

    我有一个网格视图 我添加了AutoGenerateEditButton True 我想向属于特定角色的用户显示该按钮 如果不是 则不会呈现按钮 你有什么建议吗 我必须处理哪个事件才能实现该目的 我是否必须使用模板驱动的控件 例如 ListV
  • 如何将 csv 文件导入到使用 R 内核的 Google Colab 中?

    我的计算机上有一个 csv 文件 可以将其上传到 Google 云端硬盘 我正在尝试使用 Google colab 但使用 R 而不是 Python 我怎样才能导入这个csv https stackoverflow com a 579272
  • 在scala中如何将一个案例类转换为另一个不受代码更改字段添加影响的案例类?

    case class Cat color Int isFat Boolean case class Kitten color Int isFat Boolean 我想从 Cat 构造 Kitten 但希望在不传递所有参数的情况下自动执行此操