gpt4 book ai didi

Scala:重写值类的等于

转载 作者:行者123 更新时间:2023-12-02 08:12:16 26 4
gpt4 key购买 nike

为了在我们的代码库中获得更多的类型安全,我们已经开始用类型安全的值类替换泛型字符串、整数等,但我正在努力让它们与 == 运算符一起方便地工作和文字。希望有人能帮助我。

我们的值类是这样定义和使用的:

case class Name(value: String) extends AnyVal {}
object Name { implicit def to(something:String): Name = Name(something) // convenience }

case class Address(value: String) extends AnyVal {}
object Address { implicit def to(something:String): Address = Address(something) // convenience }

case class Person(name: Name, address: Address) {
def move(newAddress: Address) = copy(address=newAddress)
}
val somebody = Person("Pete", "Street 1")

somebody.move(Address("Street 2")) // allowed
somebody.move(somebody.name) // not allowed, which is exactly what we want
somebody.move("Street 2") // allowed by convenience

现在,我希望他们“自然地”比较他们内在的值(value):

Name("Pete") == "Pete" // should be true, but evaluates to False 

我可以像这样覆盖 equals 来解决这个问题:

case class Name(value: String) extends AnyVal {
override def equals(other: Any) =
if (other.isInstanceOf[Name])
other.asInstanceOf[Name].value == this.value
else if (other.isInstanceOf[String])
other == this.value
else
false
}

Name("Pete") == "Pete" // now evaluates to true

但是,这个解不是对称的:

"Pete" == Name("Pete") // evaluates to false, because it is using String.equals

我不知道如何解决这个问题。甚至声明从 Name 到 String 的隐式转换都没有帮助(我更希望没有这样的事情)。是否有可能做我想做的事?

编辑:我可能不清楚这一点,但我并不是真的在寻找有关软件开发的建议。这是一个技术问题:能否在 Scala 中完成?

我做我所描述的事情有一些原因,但遗憾的是,它们涉及数万行 Scala 代码的代码库,无法在一个简短的堆栈溢出问题中表达。

最佳答案

我认为,您应该摆脱 convenience 隐含。他们打败了目的:

 val john = Person("Street 1", "John") // mixed up order
john.move("Pete") // Yup, I can "move" to a name ...

现在,john 是一个名叫“Street 1”的人,住在地址“Pete”。在经历了定义所有值类的麻烦之后,这不是您希望允许的事情。

关于Scala:重写值类的等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45614255/

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