gpt4 book ai didi

Scala值类,用例

转载 作者:行者123 更新时间:2023-12-04 09:30:28 25 4
gpt4 key购买 nike

我知道scala中的value class在编译器时内联该操作。

也许像这样

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

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

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

调用 this.i + that.i似乎并不比 i + i慢很多

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

最佳答案

为什么将单个值包装到其他类中?

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

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

这样做的问题是,很容易混淆两个参数,从而错误地调用该函数。使用values类,您可以创建一个 Money类型并像下面这样重写函数:
case class Money(amount: Int) extends AnyVal
def multiply(factor: Int, amount: Money): Money = ???

现在使用特殊的 Money类型,编译器会告诉您是否尝试以错误的顺序传递参数。

如果不是值(value)类,人们可能会说,在某些情况下,增加类型的安全性不值得牺牲性能。但是,使用值类时,没有运行时开销(尽管有一些限制: http://docs.scala-lang.org/overviews/core/value-classes.html)。

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

请注意,例如haskell使用 newtype表示相同的想法: https://wiki.haskell.org/Newtype

关于Scala值类,用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com