是否可以在 Scala 中对提取器(不应用)的参数使用隐式转换?

2023-12-02

我创建了一个名为 CaseInsensitive 的类,它包装一个字符串(请参阅在 Scala 中实现不区分大小写比较的字符串类).

我创建了一个 case 类,它有一个 CaseInsensitive 类型的成员变量,因此它有一个默认的 unapply 方法,该方法提取 CaseInsensitive 类型的变量,但我希望像这样使用它:

case class PropertyKey( val name : CaseInsensitive )

val foo = new PropertyKey("foo")
val result = foo match {
  case PropertyKey("foo") => true
  case _ => false
}

此代码无法编译:(在提取器行,而不是构造函数行)

type mismatch;
 found   : java.lang.String("foo")
 required: com.acme.CaseInsensitive 

但我认为我从 String 到 CaseInsensitive 的隐式转换将使这个能够编译,而不是我必须输入更详细的内容:

case class PropertyKey( val name : CaseInsensitive )

val foo = new PropertyKey("foo")
val result = foo match {
  case PropertyKey(CaseInsensitive("foo")) => true
  case _ => false
}

这是 CaseInsensitive 的实现:

/** Used to enable us to easily index objects by string, case insensitive
 * 
 * Note: this class preserve the case of your string!
 */
case class CaseInsensitive ( val _s : String ) extends Proxy {
  require( _s != null)

  val self = _s.toLowerCase
  override def toString = _s

  def i = this // convenience implicit conversion
}

object CaseInsensitive {
  implicit def CaseInsensitive2String(c : CaseInsensitive) = if ( c == null ) null else c._s
  implicit def StringToCaseInsensitive(s : String) = CaseInsensitive(s)

  def fromString( s : String ) = s match {
    case null => None
    case _ => Some(CaseInsensitive(s))
  }
}

您始终可以定义一个方便的提取器并导入它(随意使用更短的名称):

object PropertyKeyCI {
  def unapply(p: PropertyKey): Option[String] = Some(p.name.self)
}

那么,提取就是:

  val foo = new PropertyKey("foo")
  val result = foo match {
    case PropertyKeyCI("foo") => true
    case _ => false
  }

(错误语义警报)

尽管请注意,这对于 PropertyKeyCI("Foo") 来说会匹配为 false,因为您的“CaseInsensitive”类实际上是一个“LowerCase”类。我这样说是因为我很难想象 unapply() 方法所需的行为是什么。从您的案例类默认值中,您将返回原始(非小写)字符串的 Option[String] ,这会产生这种不直观的行为:

  // result == false !!!!
  val foo = new CaseInsensitive("Foo")
  val result = foo match {
    case CaseInsensitive("foo") => true
    case _ => false
  }
  val CaseInsensitive(s) = "aBcDeF"
  assertFalse(s == "abcdef")

哇哦……扔掉吧。只需使用DOS即可。

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

是否可以在 Scala 中对提取器(不应用)的参数使用隐式转换? 的相关文章

  • 为什么“private val”和“private Final val”不同?

    我曾经以为private val and private final val是一样的 直到我看到 Scala Reference 中的第 4 1 节 常量值定义的形式为 final val x e 其中 e 是常量表达式 第 6 24 节
  • 如何在 Akka Stream 中记录流量?

    我有一个带有单个流 图的 Akka Stream 应用程序 我想测量源头的流量并每 5 秒记录一次 例如 在过去 5 秒内收到 3 条消息 我尝试过 someOtherFlow groupedWithin Integer MAX VALUE
  • 简单的 Scala actor 问题

    我确信这是一个非常简单的问题 但很不好意思地说我无法理解它 我有一个 Scala 值列表 我想使用演员来并行地对每个值进行一些 外部 调用 我想等到所有值都已处理完毕 然后继续 没有共享值被修改 有人可以建议吗 Thanks Scala 中
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 将列表拆分为多个具有固定元素数量的列表

    如何将元素列表拆分为最多包含 N 个项目的列表 例如 给定一个包含 7 个元素的列表 创建 4 个组 最后一组可能包含较少的元素 split List 1 2 3 4 5 6 seven 4 gt List List 1 2 3 4 Lis
  • Spark:用列的平均值替换数据框中的空值

    如何创建 UDF 以编程方式将每列中 Spark 数据框中的空值替换为列平均值 例如 在示例中 数据 col1 空值的值为 2 4 6 8 5 5 5 示例数据 col1 col2 col3 2 null 3 4 3 3 6 5 null
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • Scala:如何编写将类型化为接收者的实现类型的对象返回的方法

    我知道 Scala 中不推荐使用案例类继承 但为了简单起见 我在以下示例中使用了它 scala gt case class Foo val f String def foo g String Foo this copy f g define
  • 对于空列表,max() 应该返回什么?

    Got java util NoSuchElementException head of empty list所以我试着检查一下 但现在我明白了 info max of a few numbers FAILED info 0 did not
  • Scala 中值类的隐式 Json 格式化程序

    我有许多值类组成了一个更大的对象案例类 final case class TopLevel foo Foo bar Bar final case class Foo foo String extends AnyVal final case
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer
  • Scala 如何忽略 Java 的检查异常?

    例如如果调用 JavaThread sleep这会抛出一个已检查的InterruptedException来自 Scala 源文件 然后不需要将调用包含在 Scala 中try catch Scala 如何删除将调用包围在 a 中的规则tr
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 使用spark phoenix从表中读取rdd分区号为1

    当我运行我的火花代码时 val sqlContext spark sqlContext val noact table primaryDataProcessor getTableData sqlContext zookeeper table
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map
  • Scala 解析器组合器的运算符优先级

    我正在研究需要考虑运算符优先级的解析逻辑 我的需求并不太复杂 首先 我需要乘法和除法比加法和减法具有更高的优先级 例如 1 2 3 应视为 1 2 3 这是一个简单的例子 但你明白了 我需要将更多自定义标记添加到优先级逻辑中 我可以根据此处
  • 在 Scala 中,使用“_”和使用命名标识符有什么区别?

    为什么当我尝试使用时会出现错误 而不是使用命名标识符 scala gt res0 res25 List Int List 1 2 3 4 5 scala gt res0 map gt item toString

随机推荐

  • C++ 将方法指针作为模板参数传递

    我有一个这样的调用者函数 template
  • 如何在 CentOS 6 上安装 ffmpeg

    我已经尝试安装 ffmpeg 2 天了 但没有成功 我在 youtube 上尝试了无数视频 在 google 上一步步尝试 但没有成功 任何帮助都会很棒 我有一台 Centos 6 服务器 是的 我在 mac 终端中使用 root ssh
  • PHP 格式日期

    如何强制输出日期格式 2012年12月12日 2012年1月10日 2012年1月5日 代替 12 12 2012 01 10 2012 01 05 2012 我的代码如下 adatefrom date create POST datefr
  • apache 日志中的 wkhtmltopdf 错误

    exec wkhtmltopdf test html output pdf 在 php 命令行中它可以工作 但是如果我尝试从 apache 调用它 它不会创建 pdf 文件并且日志显示 tail f var log apache2 erro
  • 标记上的语法错误、lambda 表达式的构造错误

    我在用于线程的以下代码中遇到了语法问题 btnNewButton addActionListener new ActionListener public void actionPerformed ActionEvent e new Thre
  • 友谊和继承有什么区别?

    假设有两个类A和B class A class B 下面的两个例子在哪些方面有所不同 示例1 class C public A public B 示例2 class C private friend class A friend class
  • 如何使用 pandas.Series.str.contains 搜索字符加上

    如何在 pandas 数据框列中使用 pandas Series str contains 搜索字符 我试过 df noplus df df column1 str contains case False 它给了我一个错误 File hom
  • 如何使用 python 为 ds:DigestValue、ds:SignatureValue 和 ds:X509Certificate 生成 Base64 哈希值?

    我需要生成并签署 XML 我使用的是 Windows 10 我有 PFX 格式的证书 也称为 P12 我已成功从该文件中提取密钥和证书 以便对 XML 进行签名 但现在我需要知道如何签署该 XML 更准确地说 如何生成此 XMl 元素的内容
  • JBoss AS 7:如何独立部署EJB和依赖WAR?

    我有一个带有一个 EJB 的应用程序 mwf ejb jar 和战争 mwf web war 如果我将它们打包在同一个 EAR 中 则一切正常 有没有办法先部署EJB 然后部署WAR 如果我尝试一下 我的 EJB JAR 部署得很好 但是当
  • 根据第一个和最后一个逗号分割字符串

    我想在第一个和最后一个逗号上分割字符串 每个字符串至少有两个 逗号 以下是示例数据集和所需的结果 这里有一个类似的问题询问如何在第一个逗号上拆分 在字符串中的第一个逗号处拆分 这里我问如何在前两个冒号上分割字符串 在前两个冒号上分割字符串
  • 错误 您的帐户已具有有效的 iOS 分发证书

    我见过其他存在此类错误的问题 但没有一个问题可以帮助我解决我的问题 我有我的个人苹果开发者帐户和我工作的公司的一个帐户 当我尝试为我的公司提交应用程序以对其进行 Beta 测试时 出现错误 您的帐户已经拥有有效的 iOS 分发证书 我尝试再
  • java手机通用签名工具

    谁能告诉我几乎所有java移动供应商 如三星 索尼 诺基亚 Micromax Moto等 使用的常用签名工具是什么 AFAIK Thawte Verisign and Java验证支持大多数设备 但一切都是成本 有一次我为此与 Thawte
  • Python + Django 页面重定向

    如何完成简单的重定向 例如cflocation在 ColdFusion 中 或header location http 对于 PHP 在 Django 中 这很简单 from django http import HttpResponseR
  • 寻找最佳报价组合的算法,该组合可以为给定的一组商品提供最大折扣

    我有带有 ID 的物品 1001 1002 1003 1004 1005 1006 There respective quantities are 2 5 1 1 5 2 现在我有如下数据 每行都有一个 OfferId offerId It
  • PHP 中如何将日期转换为时间戳?

    我如何从例如获取时间戳22 09 2008 此方法适用于bothWindows 和 Unixand is 时区意识到 如果你和你一起工作 这可能就是你想要的dates 如果您不关心时区 或者想使用服务器使用的时区 d DateTime cr
  • 如何使用 bookshelf-pagemaker 添加简单的Where子句

    使用书架页面制作器NodeJS 模块 https www npmjs com package bookshelf pagemaker https github com bhoriuchi bookshelf pagemaker 我能够获得基
  • 如何在Opengl中裁剪网格的这一部分?

    I tried to clip mesh in openGl and i think that i have a problem with math I have a cube 例如 我需要剪辑该立方体的一半 所以我不明白如何计算这个裁剪平
  • Angular 2 中同一根应用程序的多个实例

    我们将 Angular 2 集成到旧页面中 使功能逐渐变得更加用户友好 到目前为止 将预渲染的后端小部件替换为角度模块效果非常好 然而 我遇到了一个我不知道如何解决的问题 我编写了一个模块 组件 它可以在页面上的不同位置和不同的配置中多次出
  • ARC 已启用,但存在内存泄漏(目标 C)

    正如您所看到的 下面的代码除了枚举一组文件之外并没有做太多事情 全部注释掉 但是 在运行下面的函数 40 秒后 我的内存使用量增长到超过 2 GB 该函数是通过按用户界面上的按钮 我可以运行 UI 几个小时 在按下按钮之前 内存使用量不超过
  • 是否可以在 Scala 中对提取器(不应用)的参数使用隐式转换?

    我创建了一个名为 CaseInsensitive 的类 它包装一个字符串 请参阅在 Scala 中实现不区分大小写比较的字符串类 我创建了一个 case 类 它有一个 CaseInsensitive 类型的成员变量 因此它有一个默认的 un