Scala / Dotty - 将特征混合到现有对象中

2024-01-21

有没有办法将特征混合到 Dotty 或 Scala 中的现有对象中?

class SomeClass
trait SomeTrait

// This works, but it's not what I'm looking for:
new SomeClass with SomeTrait

// This is what I'm looking for, but it breaks:
val someClass = new SomeClass
someClass with SomeTrait

This https://stackoverflow.com/questions/10373318/mixing-in-a-trait-dynamically答案提供了一个宏观解决方案,但它已经有 7 年历史了,我希望(祈祷!)有更简单的东西。


那么使用类型类呢?

从您在评论中提供的示例来看您的问题:

trait Organism
trait Winged[O <: Organism]
trait Legged[O <: Organism]

class Dog extends Organism
object Dog {
   implicit val legged: Legged[Dog] = new Legged[Dog] { ... }
}

class Fly extends Organism
object Fly {
   implicit val winged: Winged[Fly] = new Winged[Fly] { ... }
   implicit val legged: Legged[Fly] = new Legged[Fly] { ... }
}

这是一种非常灵活的方法,允许您定义Legged and Winged设计特定有机体时的属性,或稍后通过相应伴生对象外部的隐式添加它们。您可以通过提供伴生对象中的隐含内容来强制有机体始终拥有腿/翅膀,或者将其留给代码的用户。

然后您可以定义

// Only Winged organisms (ie. `O` for which `Winged[O]` is available implicitly
def makeItFly[O <: Organism : Winged](o: O) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala / Dotty - 将特征混合到现有对象中 的相关文章

随机推荐

  • setup.cfg Python 项目的单源包版本

    对于具有以下功能的传统 Python 项目setup py 有多种方法可以确保版本字符串不必在整个代码库中重复 看PyPA 的 单一来源包版本 指南 https packaging python org guides single sour
  • “in”关键字有什么用?

    在 Haskell 中 为什么不在 do 块内使用 in 和 let 而必须以其他方式使用 例如 在下面有些人为的示例中 afunc Int gt Int afunc a let x 9 in a x amfunc IO Int gt IO
  • 如何从左向右推送具有滑动效果的ViewController?动画名称必填

    EDIT 下面这个 gif 的动画名称是什么 从右到左 下面这个gif 从左到右 的补充动画的动画名称是什么 NOTE 我不想继续下去 我想用该动画推送视图 EDIT 2 当我谈论动画名称时 有些人会感到困惑 然而 这里是一个有效的动画名称
  • 流定义

    我正在阅读 Java I O 流 但我对与它们相关的正确定义感到困惑 有人说流是一种传输数据的传送带 其他人说流是流或 数据序列 其他人说流是 连接到输入或输出 来源 那么正确的定义是什么 流是一个概念 但没有那么严格 只有一个描述是正确的
  • Bookdown 按照 _bookdown.yml 中指定的章节顺序停止

    Bookdown 将按字母顺序对章节进行排序 除非之后指定订单rmd files in the bookdown yml file https bookdown org yihui bookdown usage html 这在过去对我来说效
  • Z3/SMT:我什么时候应该选择推送/弹出来重置?

    我使用 Z3 来解决符号执行器产生的路径条件 该执行器以深度优先顺序探索状态空间 与 CUTE DART 或 可能 SAGE 非常相似 我们正在尝试使用 Z3 的不同方式 在一种极端情况下 我们将每个查询发送到 Z3 并在之后立即 重置 它
  • java.io.IOException:连接上的流意外结束? [复制]

    这个问题在这里已经有答案了 调用我们的内部网络服务之一似乎会出现以下错误 java io IOException unexpected end of stream on Connection webservicessandbox xxx c
  • 将 async/await 转换为 Task.ContinueWith

    这个问题是由评论引发的this one https stackoverflow com a 21326957 1768303 如何反向移植非线性async await NET 4 0 代码无需Microsoft Bcl Async 在链接的
  • 根据定义将单词映射到数字

    作为较大项目的一部分 我需要阅读文本并将每个单词表示为数字 例如 如果程序读入 每个好孩子都应该得到果实 然后我会得到一个转换表 every to 1742 good to 977513 etc 现在 显然我可以使用哈希算法来获取这些数字
  • xocde5 中没有具有有效签名身份的配置文件

    当我尝试使用 Xcode5 dp6 在设备上运行应用程序时 我收到一个错误 未发现具有有效签名身份的配置文件问题 我该如何解决这个问题 您需要做的就是 1 go to Certificates Identifiers Profiles in
  • 仅当单独布尔列表中的元素为 True 时,才对 python 列表中的元素求和

    我有两个 python 列表 A 1 2 3 4 5 B True False False True True 列表 A 和 B 的长度相同 我只想对 A 中与 B 中的 True 元素相对应的元素求和 我知道我可以用以下方法做到这一点 s
  • python 将“E”添加到字符串

    这个字符串 CREATE USER s PASSWORD s user pw 总是扩展到 CREATE USER E someuser PASSWORD E somepassword 谁能告诉我为什么 编辑 上面的扩展字符串是我的数据库在错
  • 反射 TS - 在 C++23 中?

    反射 TS C 功能描述如下 https en cppreference com w cpp keyword reflexpr https en cppreference com w cpp keyword reflexpr 我正在寻找有关
  • 尝试根据 mysql 保存用户应用程序时,WSO2 App Store 抛出错误

    当我尝试创建或编辑应用程序时 API Store 抛出错误 java sql SQLException Can t call commit when autocommit true 我添加了设置 init command set autoc
  • 与 Console.ReadLine() 相关的 RabbitMQ BasicConsume 和事件驱动问题

    下面的程序基本上是来自 C Rabbit MQ 教程中的 Receiver Worker 程序的程序 https www rabbitmq com tutorials tutorial two dotnet html https www r
  • Windows Phone 7 应用程序 - 方向更改

    各位开发者大家好 我正在开发一个 Windows Phone 7 应用程序 我无法弄清楚我认为对于经验丰富的人来说这是一个简单的问题 假设我有一个由两个元素组成的布局 一个列表框 填充了大量的项目 和一个文本块 为用户提供一些基本说明 当设
  • 什么是“表达问题”?

    我对这是什么有一个粗略的想法 但如果有人对 表达问题 有他们认为简洁直观的解释 我很想听听 Watch 这个想法是 您的程序是数据类型和对其进行操作的组合 该问题要求一种实现 允许添加类型的新情况和新操作 而不需要重新编译旧模块并保持静态类
  • Spring Bootrabbitmq连接超时问题

    我的 Spring Boot 应用程序抛出连接超时错误 并且永远无法连接 我看到的另一个有趣的问题是 它永远不会获取 Spring 应用程序属性中定义的连接超时属性 org springframework amqp AmqpTimeoutE
  • 将 Pivot xml 输出转换为不带 xml 的表格输出

    我有以下类型的表 ID Key Value 1 A aa 2 B bb 3 A ay 4 C cc 5 B bx 6 C ct 我需要输出 A B C aa bb cc ay bx ct 当我将 PIVOT 与子查询一起使用时 它不起作用
  • Scala / Dotty - 将特征混合到现有对象中

    有没有办法将特征混合到 Dotty 或 Scala 中的现有对象中 class SomeClass trait SomeTrait This works but it s not what I m looking for new SomeC