随着时间的推移,Scala删除了哪些语法选项/语言特性(以及原因)



标题很好地概括了我的问题。

弃用和删除case类继承是一个相当新的问题,我想知道在那之前哪些东西被删除或实质性地改变了。我记得在for循环中valobject的不同名称以及一些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

最新更新