gpt4 book ai didi

scala - 何时使用元组而不是案例类有意义

转载 作者:行者123 更新时间:2023-12-04 05:45:51 25 4
gpt4 key购买 nike

case class Person(firstName: String, lastName: String)



对比

type Person = (String, String) //firstName, lastName



案例类显然更具可读性。但是,我看到人们使用后者。什么时候改用元组才有意义?

作为后续

有性能差异吗?在某些语言中,使用 Tuple2 就像使用两个原语一样,而创建一个类会产生开销。但是 Scala 是不是好像 Tuple 是作为类实现的。
如果我想压缩两个序列,但出于下面提到的所有原因,我希望输出是一个案例类,情况如何。

例如
`case class UserScores(userId: Long, score: Double)`
users.zip(scores).map{(id ,score) => UserScores(id,score)}

上面的示例需要对集合进行额外的迭代,以及额外的对象创建。
可以改用 View
users.zip(scores).view.map{(id ,score) => UserScores(id,score)}.force

但我不太确定它会产生预期的效果

最佳答案

当它是最合适的抽象级别时,您应该使用元组。

例如,如果您正在编写一个框架,其中所有内容都是完全通用的,并且您可以获得的最具体的东西是“函数”、“笛卡尔积”、“半群”或“封闭的幺半群”之类的东西,那么您可能将别无选择,只能使用 Tuple .这是一个很好的例子:Semigroupal用方法:

 product[A, B](fa: F[A], fb: F[B]): F[(A, B)]

在这里,元组类型的使用是完全合理的,因为接口(interface)足够抽象。

另一个例子:在整个 Scala collection library ,你永远不会遇到像 Person(name: String, surname: String) 这样具体的东西,但是您会看到大量适用于泛型元组的方法 (A, B) .

但是,如果您的代码中最抽象的东西是
object Fred {
val name = "Fred"
val surname = "Bloggs"
}

然后你突然发现 John Doe 还需要另一个类似的对象。 , 更合适的定义是
case class Person(name: String, surname: String)

然后甚至可以像这样使用它:
val j = Person(name = "John", surname = "Doe")

当然,对领域进行准确建模具有很大的值(value)。这两个目标——准确地建模一个具体的领域与编写在尽可能多的情况下工作的通用框架——是互补的。

总结一下:
  • 您是否正在编写一个足够抽象的完全通用的框架?使用元组。
  • 您是否尝试尽可能地模拟一些具体领域?使用适当命名的案例类。

  • 这里:
    type Person = (String, String) //firstName, lastName

    看起来域和使用的抽象之间不匹配。您可以简单地从编译器不会阻止您意外交换两个组件的事实中看出这一点。相反,如果您使用通用 A 在不同的抽象级别上工作和 B类型,如果您不小心交换了 (B, A),编译器会发出错误消息在哪里 (A, B)预料之中。

    关于scala - 何时使用元组而不是案例类有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49054094/

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