最初的讨论:
Better support for structurally typed recordsOdersky对NamedTuple的初稿以及由此引发的讨论:
Pre SIP: Named tuplesGithub上相关的提交:
https://github.com/lampepfl/dotty/pull/19174Scala3 对Scala2 做了增强,参见
TUPLES BRING GENERIC PROGRAMMING TO SCALA 3但是还有个不足是,Scala3 Tuple中的元素是不具名的,只能用下标,或者_1, _2,这些特定的名字,或者pattern match去访问其中的元素;而不能像C#或者Swif或者python的namedtuple那样使用自定义的名字去访问(类似case class)。
这个改进加入了一个新的类型:NamedTuple
// Scala 3
type Person = (name: String, age: Int)
val Bob: Person = (name = "Bob", age = 33)
Bob match
case (name, age) =>
println(s"$name is $age years old")
val persons: List[Person] = ...
val minors = persons.filter: p =>
p.age < 18
不过目前对实现存在较大的争论,有一个比较有意思的点是:新增的NamedTuple与已有的Tuple两个类型的关系,有三种可能:
- NamedTupe <:< Tuple, i.e. 命名tuple是tuple的子类,这个貌似最符合直觉;
- Tuple <:< NamedTuple,tuple是命名tuple的子类,这个实现有点反直觉。但是
odersky坚持使用这种实现方式,当然确实有其理由,具体可以参看上面Pre SIP那个链接的讨论;
- Tuple 与 NamedTuple 互不为继承关系,通过增加def named与def unnamed方法实现相互转换,支持者的理由是:这样代码更清晰,虽然使用起来代码没有上面两种简练。
※ 修改:·bsxfun 于 Dec 5 18:20:27 2023 修改本文·[FROM: 183.192.16.*]
※ 来源:·水木社区
http://www.mysmth.net·[FROM: 183.192.16.*]
修改:bsxfun FROM 183.192.16.*
FROM 183.192.16.*