具有相同底层类型和相同扩展方法的顶级不透明类型

2024-03-23

我在定义具有相同底层类型和扩展方法的不透明类型时遇到了一个问题,例如:

opaque type HandleA = Int

object HandleA:

  def apply(value: Int): HandleA = value

extension (handle: HandleA) @targetName("HandleA_value") def value: Int = handle

opaque type HandleB = Int

object HandleB:

  def apply(value: Int): HandleB = value

extension (handle: HandleB) @targetName("HandleB_value") def value: Int = handle

当两个定义驻留在同一个文件中时,代码会编译,但是当定义在两个单独的文件中时,代码不会编译,并出现以下错误:

value 已定义为 ... 中的方法值

有没有办法以某种方式在单独的文件中在同一级别创建这些定义?

我尝试将对象中的定义包装在两个单独的文件中,并通过导出它们使它们在包的顶层可用

// HandleA.scala

object HandleAWrap:
  opaque type HandleA = Int

  object HandleA:

    def apply(value: Int): HandleA = value

    extension (handle: HandleA) @targetName("HandleA_value") def value: Int = handle

// HandleB.scala

object HandleBWrap:
  opaque type HandleB = Int

  object HandleB:

    def apply(value: Int): HandleB = value

    extension (handle: HandleB) @targetName("HandleB_value") def value: Int = handle

// Lib.scala

export HandleAWrap.*
export HandleBWrap.*

但是这样做我得到了一个不同的编译错误:

通过 进行循环引用

由于使用@targetName以避免名称冲突。


1/ 如第一个示例中所示(以及问题标题所暗示的那样)在顶层定义不透明类型是反模式。

目的是限制不透明类型转换的理解范围,通常是在单例中(HandleAWrap)就像你在第二个例子中所做的那样。

2/ 不透明类型的扩展方法应放置在该类型的伴生对象中。这使得它们对使用该类型的任何人都可见,而无需显式导入。同样,第二个例子是正确的,而不是第一个例子。

3/ @targetName在你的第二个例子中不需要,因为扩展方法是在object HandleA and object HandleB分别且不碰撞。

File handleA.scala:

package x

object HandleAWorld:
  opaque type HandleA = Int
  object HandleA:
    def apply(value:Int): HandleA = value
    extension (handle:HandleA) def value : Int = handle

File handleB.scala同样对于HandleB.

File lib.scala:

package x

export HandleAWorld.*
export HandleBWorld.*

Usage :

Welcome to Scala 3.2.2 (11.0.18, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.

scala> import x.*

scala> val a = HandleA(42)
val a: x.HandleAWorld.HandleA = 42

scala> val b = HandleB(3)
val b: x.HandleBWorld.HandleB = 3

scala> a.value
val res0: Int = 42

scala> b.value
val res1: Int = 3

4/ 即使有@targetName,上面的例子编译通过。 这cyclic reference via <import>您遇到的错误可能与不透明类型无关,也与@targetName.

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

具有相同底层类型和相同扩展方法的顶级不透明类型 的相关文章

  • 如何从命令行向 REPL 添加导入?

    如何使 REPL 导入命令行中给出的包 Sample scala someMagicHere import sys error scala gt imports 1 import scala Predef 162 terms 78 are
  • 具有两个通用参数的上下文边界

    在 Scala 中 我可以使用上下文边界 def sort T Ordered t Seq T 与以下意思相同 def sort T t Seq T implicit def Ordered T 如果我有一个带有两个泛型参数的类怎么办 IE
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 更改 build.sbt 自定义任务中的版本

    我在 build sbt 中定义了一个自定义任务 val doSmth taskKey Unit smth doSmth version 1 0 SNAPSHOT 但它不会改变版本 我真正想要的是自定义 sbt 发布任务 它将始终将相同的版
  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • 为什么自类型类可以声明类

    我知道 Scala 只能混合特征 这对于依赖注入和蛋糕模式是有意义的 我的问题是为什么我仍然可以声明一个需要另一个 类 但不需要特征的类 Code class C class D self C gt 这仍然编译成功 我认为它应该编译失败 因
  • Spark 2.2 无法将 df 写入 parquet

    我正在构建一个聚类算法 我需要存储模型以供将来加载 我有一个具有以下架构的数据框 val schema new StructType add StructField uniqueId LongType add StructField tim
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes
  • 如何使用scala获取elasticsearch中_delete_by_query api的状态

    我正在 scala 中向 elasticsearch 发送 HTTP post Http s http elkIp 5051 indexName delete by query postData s query terms zip id k
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • Scala:类型参数中的问号

    我试图理解以下代码 来自 Scalaz 库 def kleisliIdApplicative R Applicative Kleisli Id R 我假设一种形式T P0 是一个带有参数的类型构造函数 但是我无法找到解释类型参数中问号用法的
  • 当泛型类型与无界通配符一起使用时,不考虑类型参数绑定

    在我的项目中 我有一个这样的星座 trait F trait X A lt F def test x X X lt F x Trait X有一个类型参数 其上限为F 根据我的理解 类型X and X lt F 应该是等价的 但scalac2
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • sbt 找不到启动器 jar:./bin/sbt-launch.jar

    我已经成功地使用 sbt 进行基本的 Scala 编译好几年了 但有一天它由于某种原因停止工作 我在自己的帐户中使用它 但我决定让我的系统管理员在我们的本地网络上安装最新版本 当我尝试运行它时 我得到 找不到启动器 jar bin sbt
  • 如何将 Dataframe 列名称与 Scala 案例类属性相匹配?

    本示例中的 Spark sql 列名来自case class Person case class Person name String age Int val people RDD Person An RDD of case class o
  • InvalidRequestException(为什么:empid 如果包含 Equal,则不能被多个关系限制)

    这是关于我从 Apache Spark 查询 Cassandra 时遇到的问题 Spark 的正常查询工作正常 没有任何问题 但是当我使用关键条件进行查询时 出现以下错误 最初 我尝试查询复合键列族 它也给出了与下面相同的问题 由以下原因引
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org

随机推荐

  • 了解递归函数的工作原理

    正如标题所解释的 我有一个非常基本的编程问题 但我还无法理解 过滤掉所有 极其聪明的 为了理解递归 必须先理解递归 网上各种帖子的回复我还是不太明白 了解当面对不知道我们不知道的事情时 我们可能会倾向于提出错误的问题或错误地提出正确的问题我
  • Nodejs为Redis请求设置超时

    我编写了一个简单的服务 使用 redis 将数据存储在内存中或从磁盘中获取数据 然后存储在内存中 并希望为慢速请求设置超时 我希望找到一种方法发出带有超时的获取请求 以防止该请求挂起 任何帮助表示赞赏 因此 您可以在这里做一些事情 但是 首
  • MonoDroid 的 MVVM 框架?

    MonoDroid 已经有 MVVM 框架了吗 或者 MonoDroid 是否能够自行绑定属性和命令 例如用于 WPF Silverlight WP7 的 MVVM Light Toolkit 还没有 MVVM 但是有 MonoCross
  • 带 POST 参数的 FacesContext 重定向

    我需要使用 POST 参数将页面重定向到外部站点 但我无法使用普通 HTML
  • OpenCV 变换矩阵:仿射与透视扭曲

    您好 我目前正在研究图像转换 但有一件关于扭曲的事情我不明白 即有什么区别warpAffine http docs opencv org 2 4 modules imgproc doc geometric transformations h
  • 过期的消息不会从 RabbitMQ 中删除

    我通过生产者向 RabbitMQ 发送一条普通消息 然后发送第二条消息expiration属性分配给一个值 然后使用rabbitmqctl list queues命令我监视消息的状态 我发现如果我先发送一条普通消息 然后发送一条消息expi
  • SharePoint 在代码隐藏中获取当前页面的完整 URL

    在 SharePoint 中 如何从隐藏代码中获取当前页面的 url 例如包含 blah aspx 页面 SPContext Current Web Url 给出http vm en http vm en 我需要它http vm en Pa
  • 当信号到来时杀死 bash 脚本前台子进程

    我将 fastcgi 应用程序包装在 bash 脚本中 如下所示 bin bash stuff fastcgi bin stuff 由于 bash 仅在前台脚本结束时执行信号陷阱 所以我不能只是kill TERM scriptpid因为 f
  • Objective-C 类中的 Swift 协议扩展

    我有一个用 Swift 编写的协议 应该由多个控制器遵守 其中一些控制器是用 Objective C 编写的 并非所有人都需要此 Swift 协议中的所有方法 因此首先我决定提供一些具有默认实现的方法 以使它们成为 可选 但在这种情况下 我
  • TensorFlow 的无效参数错误(形状不兼容)

    我正在尝试使用 MNIST 数据集的张量流训练一个简单的网络 目前虽然它不起作用 它基本上是 TensorFlow 网站上给出的示例的修改版本 我只是改变了几行并删除了一层来看看发生了什么 这是我的代码 usr bin python imp
  • Spark JDBC fetchsize 选项

    我目前有一个应用程序 它应该连接到不同类型的数据库 使用 Spark 的 JDBC 选项在该数据库上运行特定查询 然后将生成的 DataFrame 写入 HDFS Oracle 的性能非常糟糕 没有检查所有这些 原来是因为fetchSize
  • 使用 matlab 识别实时视频源中的白框

    我目前正在使用 matlab 编写一个项目 该项目使用两个相对较大的方块来识别实时视频源中的一张纸 然而 纸张可以是任何颜色或上面有任何图像 我对彩色图像使用白色框 对非彩色图像使用黑色框 尽管这些框在视频中显示得非常清楚 但我不知道如何编
  • CSS3 同一元素的多次转换

    我正在尝试为我的一张背景图像制作下拉效果 我可以使用 css3 做到这一点 但它并不完整 效果应该是窗帘落下然后弹回一点 css3 的问题是我不知道如何对同一属性进行转换 因为最后一个会覆盖前一个 这是我的代码 ul nav li a AD
  • 如何在“删除文件”任务中从删除中排除某些目录和文件

    我想删除其中的所有文件 Build ArtifactStagingDirectory 它是相应构建代理文件夹中所谓的 a 文件夹 单击阅读有关天蓝色管道中预定义变量的更多信息 我也知道删除文件任务 https learn microsoft
  • Spark 结构化流检查点在生产中的使用

    在使用 Spark 结构化流时 我很难理解检查点的工作原理 我有一个 Spark 进程 它会生成一些事件 并将其记录在 Hive 表中 对于这些事件 我在 kafka 流中收到确认事件 我创建了一个新的火花过程 将 Hive 日志表中的事件
  • 用 C 和 C++ 编写的解释器如何将标识符绑定到 C(++) 函数

    我在这里讨论的是 C 和 或 C 因为这是我所知道的唯一用于解释器的语言 其中以下可能会出现问题 如果我们有一种解释性语言 X 为其编写的库如何向该语言添加函数 然后可以从用该语言编写的程序中调用这些函数 PHP 示例 substr str
  • 控制台maven编译错误

    我正在制作春季官方指南之一 http spring io guides gs maven http spring io guides gs maven 但是 当到达必须使用 Maven 进行编译的部分时 会发生以下情况 INFO Scann
  • 替换嵌套数组中的对象

    我有一个数组 其中存储了另一个代理数组 在此代理数组中 仅包含每个代理的 id 使用 ID 我获取每个代理所需的数据 并且我想用新的完整代理数据替换原始代理数组 或者至少将新数据推送给特定代理 这是我到目前为止所尝试过的 有简单的方法吗 如
  • .net C#,保护每种方法的最佳实践是什么?

    我有一个 Web 项目 其中有一个处理一些数据操作的业务层 我想通过检查是否存在活动的未结束有效来保护某些或所有方法Session在执行该方法之前 我首先想到使用Attribute上课了 但我无法正确运行它 由于该类是一个普通类并且不是派生
  • 具有相同底层类型和相同扩展方法的顶级不透明类型

    我在定义具有相同底层类型和扩展方法的不透明类型时遇到了一个问题 例如 opaque type HandleA Int object HandleA def apply value Int HandleA value extension ha