为什么 Scala 没有类型安全的 equals 方法?

2024-01-11

由于发明人强调Scala的类型安全我不明白对象上缺少 equals 方法(至少从案例类) 允许仅检查具有相同类型的对象的相等性。我希望有一个方法===默认情况下实现此行为。当然,Java 的互操作性需要有一个可以与Any类型,但在很多情况下我只想检查相同类型的对象之间的相等性。

为什么我需要它?

例如,我有两个案例类并从中创建对象

  case class Pos(x: Int, y: Int)
  case class Cube(pos: Pos)

  val startPos = new Pos(0, 0)
  val cubeOnStart = new Cube(startPos)

后来我需要检查几次位置并且写错了

  if (startPos == cubeOnStart) {
    // this code will never be executed, but unfortunately this compiles
  }

但意思是

  if (startPos == cubeOnStart.pos) {
    // this code can be executed if positions are equal
  }

如果有一个方法===我会凭直觉使用它。

为什么缺少这样的方法有充分的理由或解释吗?


Scala 中的平等是一团糟,答案是你的why问题(Stack Overflow 并不是真正理想的场所)是“因为语言设计者认为 Java 的互操作性胜过在这种情况下做合理的事情”。

至少在 Scala 的最新版本中startPos == cubeOnStart将导致警告,指出比较这些不同类型的值“将始终产生 false”。

The 斯卡拉兹图书馆 https://github.com/scalaz/scalaz提供了===您正在通过类型安全寻找的运算符Equal类型类。你会写这样的东西:

import scalaz._, Scalaz._

implicit val cubeEqual = Equal.equalA[Cube]
implicit val posEqual = Equal.equalA[Pos]

Now startPos === cubeOnStart不会编译(这正是我们想要的),但是startPos === cubeOnStart.pos将会,并将返回true.

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

为什么 Scala 没有类型安全的 equals 方法? 的相关文章

随机推荐

  • Android 如何获取媒体播放器进度条以及如何在每个活动顶部屏幕上显示它

    正在开发某些应用程序 XYZ 在该应用程序中有一个音频播放器模块 我使用以下代码从活动中启动播放器 playButton ImageButton findViewById R id play image button playButton
  • d3.selection 的一般更新模式无法按预期工作

    我很困惑为什么以下简单的更新模式不起作用 这遵循推荐的一般更新模式 http bl ocks org mbostock 3808218 据我所知 var dat One Two Buckle my shoe var sel d3 selec
  • Visual Studio 添加 DLL 作为引用错误

    我正在向项目添加库 但收到以下错误 混合模式装配是针对 运行时版本 v2 0 50727 并且无法在4 0中加载 运行时无需额外 配置信息 我不太确定我必须调整什么才能运行 有人知道应该进行哪些更改吗 Thanks PM 正如 Marc 所
  • Linux机器与docker部署Windows容器

    我有一个带有 16GB RAM 并安装了 docker 主机的 Linux 服务器 我想在其上部署一个 Windows Server 容器 是否可以 有人刚刚尝试过这个解决方案吗 2019年更新 正如所指出的管道带编码器 https sta
  • 使用默认参数专门化内部模板

    当内部模板的参数全部已知时 我在专门化内部模板时遇到困难 这是一个例子 template lt typename T0 gt struct outer template lt typename T1 void typename T2 voi
  • JavaScript - 提取函数并保持其私有

    目前我有这样的结构 function myScope myScope public function alert I m public myScope privileged function alert I can call private
  • 将 RGBA 转换为 HEX

    给定一个 css 颜色值 例如 rgba 0 0 0 0 86 假设白色背景 如何将其转换为考虑 alpha 分量的 RGB 十六进制值 由于 alpha 值都会减弱背景颜色和颜色值 因此类似这样的方法可以达到目的 function rgb
  • 通过 Python 发送多个 HTTP 请求的理想方法? [复制]

    这个问题在这里已经有答案了 可能的重复 与 urllib2 或其他 http 库的多个 异步 连接 https stackoverflow com questions 4119680 multiple asynchronous connec
  • POST 与 PUT 与 DELETE [重复]

    这个问题在这里已经有答案了 我从来没有真正理解为什么我需要 PUT 和 Delete 请求方法 在我的代码中我一直在使用post只需执行后端代码即可添加 删除某些内容 我这样做是错误的还是一直使用 POST 可以吗 我的例子 Request
  • 我可以在运行时替换 Spring bean 定义吗?

    考虑以下场景 我有一个带有 bean 的 Spring 应用程序上下文 其属性应该是可配置的 我想DataSource or MailSender 可变的应用程序配置由一个单独的 bean 管理 我们称之为configuration 管理员
  • Inno Setup 编译前/编译后操作[重复]

    这个问题在这里已经有答案了 是否可以定义预编译 后编译操作 iss script 简而言之我需要跑 bat编译前和编译后的脚本 一种方法是恢复逻辑并从批处理文件运行命令行编译器 call precompile bat ISCC exe se
  • 无法加载文件或程序集 Microsoft.Owin 3.0.0 到 3.0.1

    有趣的依赖问题 VS2015 3 NET45 将 Microsoft Owin 从 3 0 0 更新到 3 0 1 追踪此更新是问题 想要安装https www nuget org packages IdentityServer3 Acce
  • MATLAB 曲线拟合,指数与线性

    我有一组数据 绘制后如下所示 我需要使用polyfit命令来确定大致之间时间的最佳拟合指数1 7 and 2 3 我也必须比较这个指数适合一个简单的linear fit 我给出了方程Temp t Temp0 exp t t0 tau whe
  • SVG 背景悬停时闪烁一次

    我有一个带有 svg 背景的按钮 它的悬停也有一个 svg 背景 当我在页面加载后第一次将鼠标悬停在其上时 会出现闪烁 但后续悬停时不会出现闪烁 我认为这可能是一个加载问题 但即使我独立加载页面上的两个图像或预加载图像 这种闪烁仍然会发生
  • 如何在 Angular 中将工具提示动态应用到元素的动态文本内容的一部分?

    所以我有这个包含字典的 json 文件 definitions json word Some definition an expression Some other definition 我的应用程序中的组件可能与此类似 my compon
  • $.getJSON 返回按钮显示 JSON 返回数据而不是页面

    我的网站有一点问题 我有一个托管谷歌地图的页面 但是 直到用户单击按钮后才会显示地图 然后它调用 getJSON 来获取我需要在地图上显示的地址 getJSON theurl function json 一切都很好 但是 如果用户随后移动到
  • Prolog 中“if_/3”运算符的目标扩展

    我正在编写一个标记器 我想使用if 3 https stackoverflow com a 27358600 4609915保存逻辑纯粹性 questions tagged logical purity在我的代码中 The code loo
  • 什么是

    有什么区别 and
  • python 3.x,“type”本身派生自“object”,而“object”派生自“type”

    我目前正在学习 python OOP 模型并被告知 type本身源自object and object源自于type 我明白那个object是 python 3 x 中每个类的默认超类 并且typeclass 用于创建类 即类对象 obje
  • 为什么 Scala 没有类型安全的 equals 方法?

    由于发明人强调Scala的类型安全我不明白对象上缺少 equals 方法 至少从案例类 允许仅检查具有相同类型的对象的相等性 我希望有一个方法 默认情况下实现此行为 当然 Java 的互操作性需要有一个可以与Any类型 但在很多情况下我只想