标题很好地概括了我的问题。
弃用和删除case类继承是一个相当新的问题,我想知道在那之前哪些东西被删除或实质性地改变了。我记得在for循环中val
和object
的不同名称以及一些requires
关键字。
我很想看到代码示例,说明事情是如何使用的/它们后来是如何被替换的,当它发生时,有一个实际的版本,并说明原因!
PS:每个答案一个项目似乎是个好主意!
Case类继承是一个短暂的特性:它在2.7中被引入,在2.8/2.9中被弃用,最终在2.10中被删除。
的例子:
case class Foo(a: Int, b: Int)
case class Bar extends Foo(42, 43)
问题是自动提供的相等性实现在面对继承时并不真正起作用,因此该特性被删除了。
删除case类继承也有很好的效果:它将允许通过继承具体的ProductN
特性来提供更好的类型product***
方法:
val f = Foo(1,2).productIterator
f: Iterator[Any] = non-empty iterator // < 2.10
f: Iterator[Int] = non-empty iterator // 2.10 with -Xexperimental
在Scala 2.7中可以声明int
类型的东西(没有大写的"I")。由于Scala不支持原始值的概念,并试图尽可能地与所有东西保持一致,因此不建议使用此"功能"。
requires
子句在2.6版本中已弃用。
trait A requires B {
...
}
现在写成:
trait A { self: B =>
...
}
我不知道这个语法改变背后的原因。我个人觉得requires
语法更容易读。
我不知道所有的细节,但有一个非常详细的版本历史从这里开始:
http://www.scala-lang.org/node/155实际上,每个版本中的每个项目都被列出了。很多都有JIRA门票的链接。
挖掘这些数据可能需要一段时间,但我怀疑您要寻找的大部分内容都在那里。您可能没有详细看到弃用的理由,但是如果给出了JIRA票据或至少写下了该特性的指示,那么对该主题进行web搜索应该会导致讨论页面和理由。
for推导式在每个生成器之前使用关键字"val"。下一个Scala版本将不再具有此功能,但目前仍接受以下已弃用的语法:
for (val i <- 1 to 10) yield i
这被认为是不必要的冗长
类字面量(不同于classOf[]
)从语言中删除,但我无法弄清楚它们看起来像什么,但可能像它们的Java等效.class
。