8

看完Martin 关于反射和编译器的主题演讲后,我似乎无法摆脱这个疯狂的问题。马丁谈到了“(婚礼)蛋糕模式”,其中特征起着核心作用。我想知道,当我们已经拥有特征时,为什么我们还需要包?有什么package可以做,什么trait(至少在理论上)不能做?

我不是在谈论当前的实现,我只是想想象如果我们用特征替换包会是什么样子。在我的脑海里会是这样的:

  • 少一个关键字(package不需要)
  • 不需要package objects

总结我所有的问题:

  1. 理论上是否可以从语言中删除包并改用特征。
  2. 我们将从这种变化中获得什么其他好处?(我在考虑一流的包和一流的导入,但是 mixin 组合是编译时的事情,虽然超级调用是动态绑定的)
  3. Java/JVM 兼容性是唯一的阻碍吗?

更新

Daniel Spiewak 在这个主题演讲中谈到依赖注入只是蛋糕模式可以做的所有事情的冰山一角。

4

2 回答 2

7

Martin Odersky 曾说过 Scala 可以只使用特征、对象、方法和路径(我希望我没有忘记一些事情)。

类和包都在那里,因为 Scala 旨在成为一种宿主语言,即一种在宿主平台上运行(这实际上不是有趣的部分)并与宿主平台互操作的语言(这是重要的一点)。Scala 打算与之互操作的一些主机平台是 Java 平台和 CLI,它们都具有类和包(在 CLI 的情况下为命名空间)的概念,它们之间的区别非常明显,不能简单地表示为特征或对象。这与接口不同,接口可以简单地映射到纯抽象特征或从纯抽象特征映射。

上述声明是在关于可能从 Scala 中删除泛型的讨论中提出的,因为泛型可以做的所有事情也可以通过抽象类型来实现。

于 2012-07-28T23:41:11.243 回答
6

在 scala 中,对象和包的用途几乎相同,对象也称为模块。对象应该被视为模块,因为它们可以包含任何定义,当然包括其他对象,尤其是类型。

一个特征可以被认为是一个抽象模块。它可以包含任何定义,任何成员都可以是抽象的,同样重要的是,类型成员。我背诵这一切只是为了强调对称性。也许 OT 但对我来说,trait 似乎是 scala 中的一项重大创新,就像对象和功能思想的融合一样。

最后给出一个答案:

  1. 我认为可以删除包以支持对象(而不是特征)。
  2. 好处将是简化 - 不需要显式定义包对象。
  3. 我认为包与 Java/JVM 兼容性的对象不同。

更多评论:在视频中,Martin 更多地谈论特征(抽象模块)而不是具体模块,因为后者仅在最后一刻出现,以组装和具体化抽象模块的某些组合。

即使不是“混合蛋糕”,使用抽象模块也很好。例如,在草拟一些代码时,您可能会定义一个包含定义的模块。但是,一旦你找到了一个你还没有准备好填写的类型或值,就不要提供一个空值,比如 null。而是将对象切换为特征并保留成员抽象。

于 2012-07-28T11:48:10.797 回答