Scala 值类、用例

2023-12-28

I know value class在 scala 中,在编译时内联操作。

也许像这样

case class A(i: Int) extends AnyVal {
   def +(that: A) = A(this.i + that.i)
} 
A(1) + A(2) // After compile it equals to 1 + 2 

但这对我来说似乎没什么大不了的。

它可能会提高性能,但是,

calling this.i + that.i似乎并没有慢多少i + i

为什么我们需要value class在 scala 和任何用例中???


为什么要将单个值包装到附加类中?

类型安全是一大用例。假设您有可以使金钱倍增的函数,如下所示:

def multiply(factor: Int, amount: Int): Int = ???

这样做的问题是很容易混淆两个参数,从而错误地调用该函数。使用值类,您可以创建一个Money输入并重写该函数,如下所示:

case class Money(amount: Int) extends AnyVal
def multiply(factor: Int, amount: Money): Money = ???

现在与您的特别Moneytype,如果您尝试以错误的顺序传递参数,编译器会告诉您。

如果它不是一个值类,人们可能会说在某些情况下增加的类型安全不值得性能损失。然而,对于值类,您没有运行时开销(但有一些限制:http://docs.scala-lang.org/overviews/core/value-classes.html http://docs.scala-lang.org/overviews/core/value-classes.html).

实现相同目标的另一种方法是在 scalaz 中取消装箱(无运行时开销)标记类型:http://eed3si9n.com/learning-scalaz/Tagged+type.html http://eed3si9n.com/learning-scalaz/Tagged+type.html

请注意,例如 haskell 使用newtype出于同样的想法:https://wiki.haskell.org/Newtype https://wiki.haskell.org/Newtype

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

Scala 值类、用例 的相关文章

  • Scala 泛型函数值(匿名函数)- 缺少参数类型(错误)

    我是 Scala 新手 Scala 代码运行器版本 2 7 7 final 我真的不明白为什么当我们使用高阶函数时它要求调用者提供参数类型 在下面的示例中 我有一个独立的对象 Util 具有一个功能 但在Main块中 调用者必须将参数类型传
  • 为什么“private val”和“private Final val”不同?

    我曾经以为private val and private final val是一样的 直到我看到 Scala Reference 中的第 4 1 节 常量值定义的形式为 final val x e 其中 e 是常量表达式 第 6 24 节
  • 不使用 CPU 时 Cassandra 超时

    我使用 Phantom DSL 和 Datastax Cassandra 驱动程序时遇到 Cassandra 超时 然而 Cassandra 似乎并没有超载 以下是我得到的异常 com datastax driver core except
  • 简单的 Scala actor 问题

    我确信这是一个非常简单的问题 但很不好意思地说我无法理解它 我有一个 Scala 值列表 我想使用演员来并行地对每个值进行一些 外部 调用 我想等到所有值都已处理完毕 然后继续 没有共享值被修改 有人可以建议吗 Thanks Scala 中
  • 将列表拆分为多个具有固定元素数量的列表

    如何将元素列表拆分为最多包含 N 个项目的列表 例如 给定一个包含 7 个元素的列表 创建 4 个组 最后一组可能包含较少的元素 split List 1 2 3 4 5 6 seven 4 gt List List 1 2 3 4 Lis
  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • IntelliJ IDEA Scala 插件问题

    我对新的 Intellij IDEA 10 和 Scala 插件有疑问 当我在 Scala 源文件中输入任何内容时 编辑器会永久冻结 在其他文件 java 和其他 编辑器中效果很好 结构视图 scala 检查和显示成员功能已关闭 堆大小增加
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • 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
  • 我想使用 EtherPad(或克隆版本)。我的站点正在运行 Ruby on Rails。 API 还是本地安装?

    我想在我的网站上使用 etherpad 界面 两个问题 1 是否有任何带有 etherpad api 的网站可以让我远程调用 2 如果没有 安装scala并让两者同时运行有多麻烦 Thanks 查看http piratepad net ht
  • 新式(“内联”)宏需要 scala.meta

    我刚刚更新到 scala meta 2 0 0 M1 和最新的 scala 2 12 3 现在宏不再编译 我所做的唯一更改是将元版本从 1 8 0 更改为 2 0 0 M1 错误 新式 内联 宏需要 scala meta 有谁知道是否有快速
  • scala/spark 代码不允许在 hive 中添加列

    如果源数据有新列 我尝试在 Hive 表中添加一列 所有新列的检测都运行良好 但是 当我尝试将列添加到目标表时 我收到此错误 for f lt df schema fields if f name chk spark sqlContext
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum
  • Scala 相当于 Java 的 Number

    我正在尝试为数值域类型构建类型层次结构 例如AYear is an Int 这是一个Number a Percentage is a Double 这是一个Number等等 我需要层次结构以便我可以调用toInt or toDouble关于
  • 使用 Akka 玩 2.5 - 找不到参数超时的隐式值:akka.util.Timeout

    我正在尝试使用 Play 2 5 测试 Akka 但遇到了一个似乎无法解决的编译错误 我正在关注 Play 文档中的此页面 https playframework com documentation 2 5 x ScalaAkka http
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • 在 Scala 和 SBT 中调试较长的编译时间

    在我的 Scala SBT 项目中 我有一个文件需要 5 分钟才能编译 所有其他的都可以在几秒钟内编译 这使得开发非常痛苦 我确信我滥用了一些 Scala 构造 但我不知道如何调试它 如何在 Scala 中调试较长的编译时间 我正在使用 S
  • Scala:如何在超类上实现克隆方法,并在子类中使用它?

    我可能会以错误的方式处理这个问题 但我想要一个像这样的对象 class MyDataStructure def myClone val clone new MyDataStructure do stuff to make clone the
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble

随机推荐

  • JavaFX:带有自动换行的 TextFlow 的最佳宽度

    With Textflow setMaxWidth double 我可以实现文字换行 但我该如何调整宽度TextFlow之后以便它基于实际的包裹位置 换句话说 如何让TextFlow边界捕捉到它的所有子级Text边界以消除右侧的空白区域 E
  • 在 C# 中预览 PDF

    我正在寻找 NET GUI 组件 不同于PDFsharp http www pdfsharp net 允许预览 PDF 1 页文档 基本上我需要类似于 PictureBox 的东西 我可以在其中加载位图并显示它 如果该组件允许在内部缩放和移
  • SOAUI肥皂数字签名

    我需要在客户端中对肥皂消息进行数字签名 我已获得包含私钥和证书的 PEM 文件 我想用 SoapUI 进行测试 签名配置在传出 WS 安全配置中完成 请参见图片 同样 pem 在密钥库 证书选项卡中添加正常 但发送到服务的肥皂消息未签名 有
  • 从 python 调用 c++ 函数

    我试图从我的 Python 代码中调用 C 函数 如果我传递一个布尔值或一个int它工作得很好 但如果我发送一个字符串 它只打印第一个字符 我正在编译 g c fPIC foo cpp Wextra Wall o foo o g share
  • 如何获取产品组的关联产品?

    我正在循环访问产品结果 如果该产品是分组产品 我想获取该组中的所有产品 我正在这样做 products Mage getModel catalog product gt getCollection gt addAttributeToSele
  • @OneToMany 关系不会在子表中保存父级的主键

    假设存在三个 JPA 实体 APerson和两个一对多的关系 当我试图拯救那个人时AD P ID and AC P ID外键始终为空 这些字段的预期值是人员 ID 我究竟做错了什么 Person java 这包含与以下对象的一对多关系Acc
  • WebDriverWait 异常仅在 Visual Studio 2015 的调试模式下抛出

    我想知道其他人是否遇到过类似的问题或有使用 WebDriverWait 的经验 如果他们知道为什么我得到一个 NoSuchElementException 这似乎仅在调试模式下抛出 在正常运行时运行测试时 我不会抛出此错误 我也可以单击 继
  • 如何在不在“视图中”时卸载图像以节省内存?

    我有一个很长的图片库 我希望能够在移动设备上显示它们 而不会导致浏览器崩溃或导致滚动不稳定 有很多插件可以延迟加载图像 但是有没有什么可以在不在视图中时卸载图像以节省内存 这是 LinkedIn 工程团队博客文章中的引述iPad 版 Lin
  • 带有 Google Play 服务的 Appengine 上的 Oauth

    我在 Android 上使用 Google Play 服务来访问 Google API 和 Google 云端点 我还可以使用 Google Play 服务中的令牌访问 appengine User api 这可能吗 这里有一些示例代码li
  • 升级 Android 支持库 23.2.0 后出现代码分析错误(意外的命名空间前缀)

    我升级到Android支持库23 2 0并添加 vectorDrawables useSupportLibrary true 到我的 build gradle 这样我就可以为低于 21 的 api 提供矢量可绘制支持 请参阅here htt
  • 在实现接口中定义的没有 throws 子句的方法时,如何添加 throws Exception 子句?

    我需要一个类来在集合中导航 然后我实现了 Iterator 接口 但问题是 我的next 方法的实现需要抛出异常 因为集合成员需要动态生成 生成过程中可能会发生异常 next 抛出的唯一异常是 NoSuchElementException
  • LibreOffice 链接到外部数据

    I have a problem to import into LibreOffice an external csv 我按 确定 一切格式都正确 确定 按钮被禁用后 我无法继续 有什么建议吗 我有同样的问题 Calc 无法从外部数据源导入
  • 在 Web 表单中使用 URL 路由生成 URL

    我知道在 MVC 框架中 您有 Html 类来创建 URL Html ActionLink About us about home 但是如果您想在 Webforms 中生成 URL 怎么办 我还没有找到关于使用 Webforms 生成 UR
  • 当数据库表已填充JPA时如何正确设置@Id字段

    我的数据库中有一个表 并且我添加了 Id字段上的属性 作为strategy I use GenerationType IDENTITY 当数据库表尚未由 SQL 脚本中的行填充时 此方法可以正常工作 当表中已经有一些行时 如何设法让它工作
  • 为什么我的 rake 调用会导致“未定义方法‘source_index’”错误?

    我正在尝试跑步bundle exec rake db migrate然后遇到以下错误 bundle exec rake db migrate trace Invoke db migrate first time Invoke environ
  • Bootstrap.js 可以在 GAS(Google Apps 脚本)中使用吗?

    在 GAS 中 我想将 HTML 内容放置在选项卡中 就像此处描述 http getbootstrap com javascript tabs 我建立了一个工作原型这个jsFiddle http jsfiddle net 8g2xbm4c
  • 子控件的宽度应与父容器的宽度匹配

    我对 WPF 还很陌生 我经常发现自己很难让一堆子控件的组合宽度与给定的父容器相匹配 如下所示
  • 将标签绑定到“变量”

    假设我有一个名为 X 的全局变量 INT 由于 X 是全局变量 我们可以假设任何东西都可以修改它的值 因此每次都会更改它 假设我有一个名为 label 的标签控件 这就是我想要实现的目标 我想将 label Text 的值 绑定 到变量 X
  • IE9-10 中 SVG 压缩的背景大小

    我有一个带有背景图像的 div 集 div Play Video div 使用以下 CSS div background image url icon png background image url icon svg none backg
  • Scala 值类、用例

    I know value class在 scala 中 在编译时内联操作 也许像这样 case class A i Int extends AnyVal def that A A this i that i A 1 A 2 After co