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 = ???
现在与您的特别Money
type,如果您尝试以错误的顺序传递参数,编译器会告诉您。
如果它不是一个值类,人们可能会说在某些情况下增加的类型安全不值得性能损失。然而,对于值类,您没有运行时开销(但有一些限制: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(使用前将#替换为@)