Scala - 隐式转换与 unapply

2023-12-21

我想要一个提取器隐式转换其参数,但它似乎不起作用。考虑这个非常简单的情况:

case class MyString(s: String) {}

implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s

object Apply {
    def unapply(s: MyString): Option[String] = Some(s)
}

但我无法按照我的预期使用它:

val Apply(z) = "a"  // error: scrutinee is incompatible with pattern type

任何人都可以解释为什么它无法将参数从String to MyString?我希望它会打电话string2mystring("a")在飞行中。显然我可以通过说来解决这个问题val Apply(y) = MyString("a"),但似乎我不必这样做。

注意:这个问题类似于this one https://stackoverflow.com/questions/1820777/is-it-possible-to-use-implicit-conversions-for-parameters-to-extractors-unapply,但是 1)对于为什么会发生这种情况,人们并没有一个很好的答案,2)这个例子比它需要的更复杂。


模式匹配时不应用隐式转换。这不是代码的错误或问题,这只是 Scala 创建者的设计决策。

要修复它,您应该编写另一个接受的提取器String——这又可以调用你的隐式转换。

或者,您可以尝试使用视图绑定,这似乎也有效,并且如果您稍后将其他隐式转换定义为MyString:

object Apply {
  def unapply[S <% MyString](s: S): Option[String] = Some(s.s)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala - 隐式转换与 unapply 的相关文章

  • IntelliJ IDEA 13 给出有关不兼容类型的无效错误(Play 中的 Java-Scala-InterOp)

    我刚刚从 IDEA 12 升级到 13 社区版 从那时起 我在 IDEA 中收到关于我的游戏项目的类型不兼容的错误 Option
  • 如何识别远程参与者?

    我有一个远程参与者 客户端 它正在向另一个远程参与者 服务器 注册 然后注销 使用关闭挂钩 然而 虽然服务器接收到注销 但实际sender财产是一个不同的 Channel 对象 所以在我的服务器日志中我有 Registered new cl
  • 为什么 astyanax (java) 无法识别我的 scala 案例类参数列表中的 @Id 注解值?

    所以这是我的困境 我有一个域模型 其中有一堆 scala 中的案例类 例如User and Organization 在我的数据访问层 dao 存储库等 中 我使用 astyanax 来自 netflix 的 java 库 及其实体持久器将
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 手动排除sbt中的一些测试类

    我通常在 CI 中执行以下命令 清理更新编译测试发布 但是 我想从 sbt 命令行中排除 1 个 或几个 测试类 我怎样才能做到这一点 我不想更改我的代码以使用忽略等 两种可能的选择 test only See http www scala
  • Scala Sparkcollect_list() 与 array()

    有什么区别collect list and array 在 Spark 中使用 scala 我看到到处都有使用情况 但我不清楚用例来确定差异 尽管两者array https spark apache org docs latest api
  • 如何列出所有 sbt 依赖项?

    我需要列出所有 sbt 依赖项 以便检查是否已存在 debian 软件包 我还注意到有一个 DEB 包 http www scala sbt org 0 13 tutorial Installing sbt on Linux html但似乎
  • 获取两个顶点之间的边属性值时出现 ClassCastException

    我正在尝试获取两个顶点之间的边缘属性值并低于异常 java lang ClassCastException 无法将 java lang String 转换为 scala runtime Nothing 环境 内存中的泰坦 Code val
  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • Scala 条件列表构造

    我正在使用 Scala 2 9 2 并且想根据某些条件构建一个列表 考虑以下情况 其中 cond 是采用谓词 p 和类型 T 的值 在本例中为 t3 的某个函数 t1 t2 cond p t3 t4 我想要的行为如下 如果 p 为真 则应给
  • Spark Streaming 中是否需要检查点

    我注意到 Spark 流示例也有检查点代码 我的问题是检查点有多重要 如果是为了容错 那么在此类流应用程序中发生故障的频率是多少 这一切都取决于您的用例 假设您正在运行一个流作业 它仅从 Kafka 读取数据并计算记录数 如果您的应用程序在
  • Scala REPL / SBT Console 是否有配置文件?

    我一直在尝试找到某种点文件来放入 Scala REPL 设置和自定义函数 我特别有兴趣传递它的标志 例如 Dscala color 启用语法突出显示 以及覆盖设置 如结果字符串截断 scala gt power scala gt vals
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h
  • akka-http:找不到参数解组的隐式值

    我的 Spray json 支持看起来像这样 object MarshallingSupport extends SprayJsonSupport implicit def json4sFormats Formats DefaultForm
  • scala.math.BigDecimal :1.2 和 1.20 相等

    将 Double 或 String 转换为 scala math BigDecimal 时如何保持精度和尾随零 用例 在 JSON 消息中 属性的类型为 String 值为 1 20 但是在 Scala 中读取这个属性并将其转换为 BigD
  • 按元素聚合数组

    Spark scala 相当新 我想知道是否有一种简单的方法以按列方式聚合 Array Double 这是一个例子 c1 c2 c3 1 1 1 0 1 0 3 4 1 2 1 0 0 0 4 3 2 1 0 0 0 0 0 0 2 3 1
  • WSClient - 打开的文件太多

    我正在 CentOS 6 上使用 Play Framework 2 4 我的应用程序抛出此异常 java net SocketException Too many open files 我在 Stack Overflow 上搜索了很多主题并
  • Scala 2.8 中 <:<、<%< 和 =:= 的含义是什么?它们的文档在哪里?

    我可以在 API 文档中看到Predef https scala lang org files archive api 2 8 2 scala Predef 24 html它们是通用函数类型 From gt To 的子类 但仅此而已 嗯什么
  • Scala apply 方法调用,因为括号与隐式参数冲突

    Cay Horstmann 的书 Scala for the Impressive 中有一段关于 apply 方法的注释 有时 表示法会与另一个 Scala 功能发生冲突 隐式参数 例如 表达式 Bonjour sorted 3 产生错误
  • 与文件名中的冒号“:”作斗争

    我有以下代码 用于加载大量 csv gz 并将它们转储到其他文件夹中 并将源文件名作为一列 object DailyMerger extends App def allFiles path File List File val parts

随机推荐

  • Coq Proof Assistant 中依赖类型的问题

    考虑以下简单的表达语言 Inductive Exp Set EConst nat gt Exp EVar nat gt Exp EFun nat gt list Exp gt Exp 及其格式良好的谓词 Definition Env lis
  • 设置 gdb 和 eclipse 从 Android 应用程序调试共享库后,无法访问地址 0X1 处的内存

    我有两个 Android 项目 一个是一个库 另一个是使用该库的常规应用程序 我的目标是从 Android 应用程序调试共享库 我遵循了这个指南 http mhandroid wordpress com 2011 01 23 using e
  • smtplib 在 Python 3.1 中使用 unicode 字符发送邮件的问题

    您好 我遇到了 unicode 电子邮件的问题 当我尝试用西班牙语发送 A adir 等单词时 系统崩溃了 我尝试了此链接上的说明 Python 3 smtplib 使用unicode字符发送 https stackoverflow com
  • 无法使用 JAXB 生成类

    我尝试使用 JAXB 生成类 但出现异常 IllegalArgumentException 非法模式字符 g 我使用一个复杂的 XSD 文件和一个绑定文件 如下所示 有人可以提供调查地点的线索吗
  • Python 获取<标题>

    我想获取使用 urllib2 打开的网页的标题 执行此操作的最佳方法是什么 解析 html 并找到我需要的内容 目前只有 标记 但将来可能需要更多 有没有一个好的解析库用于此目的 是的 我会推荐美丽汤 http www crummy com
  • KissFFT(kiss_fftr 到 Kiss_fftri) - 如何重建原始信号?

    我在理解如何正确使用 KissFFT 1 2 9 时遇到一些困难 我现在想要实现的目标是执行 FFT 然后立即执行 iFFT 以再次重建原始信号 下面的代码片段演示了我正在做的事情 void test short timeDomainDat
  • 如何从 bash 脚本中删除注释

    我正在尝试制作一个将脚本文件作为参数的脚本 它应该从文件中删除注释并将其通过管道传输到另一个脚本 如果可能的话 没有临时文件 一开始我想做这个 cut d f1 1 script name 但它也会清除一部分不是注释的行 因为有一些命令在其
  • WCF Net.TCP 服务抛出模糊错误

    我正在尝试为现有 WCF 服务启用额外的 net tcp 端点 使用用户名身份验证 该服务托管在 IIS7 中 针对服务执行客户端会返回套接字连接已中止的错误 启用对服务的跟踪后会发现抛出以下异常 System ArgumentOutOfR
  • 使用反射创建新对象?

    给定类值 public class Value private int xVal1 private int xVal2 private double pVal constructor of the Value class public Va
  • 通过引用传递智能指针

    智能指针通常很小 因此按值传递不是问题 但传递对它们的引用是否有问题 或者更确切地说 是否存在不能这样做的特定情况 我正在编写一个包装器库 并且我的几个类将智能指针对象包装在底层库中 我的类不是智能指针 但 API 目前按值传递智能指针对象
  • 使用 jQuery 设置要在第一个位置显示的选项

    我有一个带有一些选项的选择元素
  • Opera 中的 JavaScript 范围问题?

    我有一个类似于小部件的 HTML JavaScript 块 人们可以将其复制 粘贴到他们的 HTML 页面中一次或多次 该块检查 DOM 中是否已存在外部 JavaScript 文件 如果没有则加载它 如下所示 function d doc
  • 挑战 - 将 XML 处理成 T-SQL 表结构?

    如果您有此 XML
  • 触摸屏上的“滚轮”事件

    我有这个小提琴https jsfiddle net 316n1xmL 1 https jsfiddle net 316n1xmL 1 这在桌面上完美地满足了我的需要 根据滚轮滚动方向向上或向下计数并添加和删除类 我遇到的问题是如何在触摸屏上
  • XmlTextWriter序列化问题

    我正在尝试创建一段 xml 我已经使用 xsd exe 创建了数据类 根类是MESSAGE 所以创建之后MESSAGE并填充其所有属性 我将其序列化如下 serializer new XmlSerializer typeof Xsd MES
  • 未解决的___stdio_common_vsprintf_s,什么库有这个?

    我正在使用 VS2015 社区 我已经获得了一些我正在尝试构建的 C 代码 这一切都是用 C 编写的 我已经制作了一个项目作为控制台应用程序 当我构建时 我收到以下错误 问题是链接过程中找不到 stdio common vsprintf s
  • 首次使用函数的 gcc 属性

    我一直在使用gccconst and pure返回指向首次使用时分配和初始化的 常量 数据的指针的函数的属性 即函数每次调用时将返回相同的值 作为一个示例 不是我的用例 而是一个众所周知的示例 请考虑一个函数 该函数在第一次调用时分配和计算
  • 在没有虚拟内存支持的系统中进行链接和分页

    首先 虚拟内存是系统的硬件特性 还是仅由操作系统实现 在链接时重定位期间 链接器将运行时地址分配给生成的可执行文件中的每个节和每个符号 这些运行时地址是否对应于虚拟地址 如果生成可执行文件的系统不使用虚拟内存怎么办 接下来 如果不使用虚拟内
  • 我可以将 emmeans 与 LME 模型一起使用吗?

    我使用的 LME 模型定义如下 mod4 lme lt lme pRNFL Init Age Status I Time 2 random 1 Patient EyeID data long1 na action na omit 输出是 g
  • Scala - 隐式转换与 unapply

    我想要一个提取器隐式转换其参数 但它似乎不起作用 考虑这个非常简单的情况 case class MyString s String implicit def string2mystring x String MyString new MyS